Solo porque nunca he leído archivos binarios antes de escribir un programa que lea archivos STL binarios. Uso el miembro de lectura ifstream
que toma un parámetro char * a. Para convertir mi estructura en un char * utilizo reinterpret_cast. Pero, por lo que recuerdo, cada libro sobre C++ que leí decía algo así como "no uses reinterpret_cast, excepto que tienes que hacerlo". ¿Cuál sería una mejor manera de leer los datos binarios, no necesariamente directos, pero al final en una estructura y sin reinterpretar_cast?Lectura de datos binarios sin reinterpret_cast
La función principal:
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
Y la estructura de triángulo
//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)
(pregunta adicional: #pragma pack (1) no funciona con cygwins g ++ - 4 ¿Cómo puedo determinar. el tamaño de la estructura?)
Si está leyendo/escribiendo datos binarios, es una buena idea usar reinterpret_cast. Esto se debe a que el código es inherentemente no portátil y, por lo tanto, reinterpret_cast es una buena forma de auto-documentar el código para indicar que el código no es portátil. Nota: no hay nada incorrecto con su código. No es portátil debido a la forma en que C/C++ define los tipos básicos y su diseño (que puede ser diferente en los indicadores de hardware/OS/compilador/compilador). –