viceversa recursivo que programa para imprimir funciones convierte convierta convertir codigo binario algoritmo c++ binary ifstream integer

recursivo - ¿No se pueden leer enteros binarios simples del archivo?(C++)



programa en c++ que convierta de decimal a binario y viceversa (3)

Este código:

#include <iostream> #include <fstream> using namespace std; int main() { { ofstream w( "foo.txt" ); int ints[10] = {0,1,2,3,4,5,6,8,9}; w.write((char*)&ints, sizeof(ints)); } { ifstream r( "foo.txt" ); int in_ints[10]; r.read((char*)&in_ints, sizeof(in_ints)); for( int i = 0; i < 10; i++) { cout << in_ints[i] << " "; } } }

huellas dactilares:

0 1 2 3 4 5 6 8 9 0

Tenga en cuenta que faltan algunos números en su inicialización.

Mi código es simplemente así:

ACTUALIZADO :

#include <iostream> #include <fstream> using namespace std; int main(int argc, char **argv) { ifstream r("foo.bin", ios::binary); ofstream w("foo.bin", ios::binary); int i; int ints[10] = {0,1,2,3,4,5,6,8,9}; w.write((char*)&ints, sizeof(ints)); int in_ints[10]; r.read((char*)&in_ints, sizeof(in_ints)); for(i = 0;i < 10;i++) { cout << in_ints[i] << " "; } cout << endl; return 0; }

Ahora, la parte de escritura parece ser exitosa, por ejemplo, ejecutar el comando od con longitudes de 32 bits (mi sistema es de 32 bits) mostrará la secuencia correcta, incluido un volcado hexadecimal.

Sin embargo, al leer, obtengo secuencias aleatorias tales y números enteros negativos que no deberían suceder (está dividido, y sobre todo ceros ya que mis enteros son pequeños, los bits de los signos no deberían estar activados).

¿Ves por qué mi método de lectura no ha funcionado, cuando realmente es un opuesto a mi método de escritura?


Los datos escritos en un archivo no son necesariamente visibles para otras transmisiones (en el mismo proceso o no) hasta que el archivo se cierre, o al menos se vacíe. Y si el archivo "foo.bin" no existe antes de iniciar el programa, abrirlo para su lectura fallará (y por lo tanto, todo uso posterior será no operativo). Su programa infringe una de las reglas más básicas de programación: si algo puede fallar, siempre verifique que no haya sucedido antes. No verifica ninguno de los resultados de su IO.

También podría agregar que leer y escribir datos de esta manera es muy, muy frágil, y en general solo se puede garantizar que funcione dentro del mismo proceso; incluso volver a compilar con una versión diferente del compilador o diferentes opciones del compilador puede hacer que cambie la representación de los datos. , con los resultados de que no podrá leer los datos escritos anteriormente. En el caso de las matrices de int , por supuesto, esto es altamente improbable siempre que no cambie las arquitecturas de la máquina. Pero, en general, si necesita volver a leer los datos en el futuro, es una técnica que es mejor evitar. (Los (char*) son reinterpret_cast , y como sabemos, reinterpret_cast es una señal muy fuerte de que hay un problema de portabilidad).


Pruebe w.flush() o w.close() antes de r.read . el problema es que cuando lo escribe, generalmente guarda el texto y no lo guarda en el archivo. entonces no hay nada realmente en archivo para r.read .