manejo - lectura y escritura de archivos en c++
Escritura y lectura en C++ dobles desde un archivo binario (4)
Quiero realizar operaciones de E / S de disco para un programa que requiere demasiada RAM. Yo uso matrices de dobles y creo que escribirlas en el disco como bytes es la forma más rápida (necesito preservar la doble precisión).
¿Cómo hacerlo con la portabilidad?
Encontré este código ( aquí ) pero el autor dice que no es portátil ...
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ofstream ofs( "atest.txt", ios::binary );
if ( ofs ) {
double pi = 3.14;
ofs.write( reinterpret_cast<char*>( &pi ), sizeof pi );
// Close the file to unlock it
ofs.close();
// Use a new object so we don''t have to worry
// about error states in the old object
ifstream ifs( "atest.txt", ios::binary );
double read;
if ( ifs ) {
ifs.read( reinterpret_cast<char*>( &read ), sizeof read );
cout << read << ''/n'';
}
}
return 0;
}
¿Cómo hacerlo con la portabilidad?
Hay diferentes definiciones / niveles de portabilidad. Si todo lo que hace es escribirlos en una máquina y leerlos en la misma, la única portabilidad que le preocupa es si este código está bien definido. (Es.)
Si desea escribir de forma portátil en varias plataformas diferentes, necesita escribir valores de cadena , en lugar de valores binarios.
Sin embargo, tenga en cuenta que el código que tiene le falta el manejo adecuado de errores. No verifica si el archivo se puede abrir y escribir correctamente.
Creo que el problema de la portabilidad solo ocurre cuando escribes en un archivo y lees en un equipo diferente. Sin embargo, dado que dijiste que quieres leer / escribir en un archivo debido a limitaciones de ram, solo puedo asumir que harías operaciones de lectura / escritura en una máquina a la vez. Esto debería funcionar.
Por lo general, tengo acceso a los bytes con unión.
union Data {
double val;
unsigned char str[sizeof(double)];
};
void saveToFile(double *values, int nvalues, const char *filename){
int i;
FILE *arq;
Data num;
arq=fopen(filename,"w");
if (arq == NULL) {
printf("Failed to open file /"%s/"/n", filename);
exit(0);
}
for(i=0; i<nvalues; i++){
num.val = values[i];
fwrite (num.str , sizeof(char), sizeof(double), arq); //ChunkSize
}
fclose(arq);
}
void loadFromFile(double *values, int nvalues, const char *filename){
int i;
FILE *arq;
Data num;
arq=fopen(filename,"r");
if (arq == NULL) {
printf("Failed to open file /"%s/"/n", filename);
exit(0);
}
for(i=0; i<nvalues; i++){
fread(num.str, sizeof(char), sizeof(double), arq);
values[i] = num.val;
}
fclose(arq);
}
Puede haberse referido a la representación binaria en general, no solo a sizeof.
C - Serialización de los números de punto flotante (flotantes, dobles)
La especificación no especifica la representación binaria de los números de coma flotante en absoluto. La mayoría de los compiladores siguen IEEE, por lo que una pequeña prueba unitaria debería garantizar el comportamiento que desea si conoce las plataformas de destino.