因为我之前从未读过二进制文件,所以我写了一个程序来读取二进制STL文件。我使用ifstream
的read成员函数,并将char*作为参数。为了将我的结构体转换为char*,我使用了reinterpret_cast。但就我所记得的,我读过的关于C++的每一本书都说过类似的话:“除非必须,否则不要使用reinterpret_cast”。有没有更好的方法来读取二进制数据,不一定是直接读取,但至少要在结构体中进行,而不使用reinterpret_cast?
主要功能:
std::ifstream in (cmdline[1].c_str(), std::ios::binary);
in.seekg(80, std::ifstream::beg); //skip header
int numTriangle;
in.read (reinterpret_cast<char*>(&numTriangle), sizeof(int)); //determine number of triangles
//create triangle data type and read data
triangle* t = new triangle();
for (int i = 0; i < numTriangle; ++i) {
in.read(reinterpret_cast<char*>(t), triangle::size);
std::cout << *t; // there's an opertor<< for triangle
}
delete t;
in.close(); //close file read from
还有三角形结构体
//attempt to get the right size of a class without structure padding
#pragma pack(push)
#pragma pack(1)
//standard STL triangle data structure
struct triangle {
public:
float n[3]; //normals, 4*3=12 bytes
float x[3]; //first point of the triangle, 4*3=12 bytes
float y[3]; //second point of the triangle, 4*3=12 bytes
float z[3]; //third point of the triangle, 4*3=12 bytes
long int a; //attributes, 2 bytes
static const int size = 12+12+12+12+2; //sum of member variables
//static const int size = sizeof(n) + sizeof(x) + sizeof(y) + sizeof(z) + sizeof(a);
};
#pragma pack(pop)
(额外问题:#pragma pack(1) 在 cygwin 的 g++-4 上无效。我该如何确定结构体的大小?)