Para algunos trabajos gráficos, necesito leer una gran cantidad de datos lo más rápido posible y me gustaría leer y escribir directamente las estructuras de datos en el disco. Básicamente tengo una carga de modelos 3D en varios formatos de archivo que tardan demasiado en cargarse, así que quiero escribirlos en su formato "preparado" como un caché que se cargará mucho más rápido en las ejecuciones posteriores del programa.Lectura y escritura de vectores C++ en un archivo
¿Es seguro hacerlo así? ¿Mis preocupaciones están relacionadas directamente con la lectura de los datos del vector? He eliminado la comprobación de errores, he codificado 4 como el tamaño del int y así sucesivamente para poder dar un breve ejemplo de trabajo, sé que es un código incorrecto, mi pregunta es si es seguro en C++ leer una matriz completa de estructuras directamente en un vector como este? Creo que es así, pero C++ tiene tantas trampas y un comportamiento indefinido cuando comienzas a ir a un nivel bajo y lidias directamente con la memoria en bruto como esta.
Me doy cuenta de que los formatos y tamaños de números pueden cambiar entre plataformas y compiladores, pero esto solo será leído y escrito por el mismo programa de compilación para almacenar en caché los datos que puedan ser necesarios en una ejecución posterior del mismo programa.
#include <fstream>
#include <vector>
using namespace std;
struct Vertex
{
float x, y, z;
};
typedef vector<Vertex> VertexList;
int main()
{
// Create a list for testing
VertexList list;
Vertex v1 = {1.0f, 2.0f, 3.0f}; list.push_back(v1);
Vertex v2 = {2.0f, 100.0f, 3.0f}; list.push_back(v2);
Vertex v3 = {3.0f, 200.0f, 3.0f}; list.push_back(v3);
Vertex v4 = {4.0f, 300.0f, 3.0f}; list.push_back(v4);
// Write out a list to a disk file
ofstream os ("data.dat", ios::binary);
int size1 = list.size();
os.write((const char*)&size1, 4);
os.write((const char*)&list[0], size1 * sizeof(Vertex));
os.close();
// Read it back in
VertexList list2;
ifstream is("data.dat", ios::binary);
int size2;
is.read((char*)&size2, 4);
list2.resize(size2);
// Is it safe to read a whole array of structures directly into the vector?
is.read((char*)&list2[0], size2 * sizeof(Vertex));
}
Trate de evitar el uso de constantes mágicas: 'os.write (y size1, sizeof (size1))' es mejor que la hardcoding 4 allí. Lo mismo vale para la lectura. –
@David, trate de evitar no leer la pregunta antes de hacer comentarios;) –
@Poita_ :) Sé que el cambio ha sido solo para la compactación, pero el hecho es que '4' es apenas un poco más pequeño que' sizeof (int) ', y el último siempre debe ser preferido, incluso en fragmentos de código sintetizados. –