Autor
|
Tema: Archivo binario, al leerlo me muestra 2 veces el ultimo registro (Leído 8,173 veces)
|
.:BlackCoder:.
Desconectado
Mensajes: 388
Cada dia C++!!
|
Buenas, estaba retomando el tema de archivos pero me quede estancado #include <cstdlib> #include <iostream> #include <fstream> using namespace std; class Personas{ private: char Nombre[30]; int edad; public: Personas(char *x="",int e=0){ strcpy(Nombre,x); edad=e; } const char* getNombre() const{ return Nombre; } int getEdad() const{ return edad; } void setNombre(const char cad[]){ strcpy(Nombre,cad); } void setEdad(const int e){ edad=e; } }; void mostrar(){ ifstream ent("PRUEBA.dat",ios::in | ios::binary); Personas aux; while(!ent.eof()){ ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas)); cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl; } ent.close(); } int main(int argc, char *argv[]) { Personas persona("ALGUIEN",50); Personas persona2("Otro",20); ofstream sal("PRUEBA.dat", ios::out | ios::binary); sal.write(reinterpret_cast<char *>( &persona ), sizeof(Personas)); sal.write(reinterpret_cast<char *>( &persona2 ), sizeof(Personas)); sal.close(); mostrar(); system("PAUSE"); return EXIT_SUCCESS; }
El programa muestra 2 veces el ultimo registro es decir, muestra: ALGUIEN 50 Otro 20 Otro 20 Por que?
|
|
« Última modificación: 12 Marzo 2011, 05:57 am por .:BlackCoder:. »
|
En línea
|
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Porque EOF devuelve true cuando ya pasaste por el final del archivo y no cuando estas a punto de pasarlo, por ende imprimes el contenido por duplicado. Sigue paso por paso la ejecución del bucle en una hoja y chequea siempre cuales son los contenidos a imprimir, y quedara mas claro. Por lo pronto puedes solucionarlo así: while(!ent.eof() && ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas))) cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl;
Saludos
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
.:BlackCoder:.
Desconectado
Mensajes: 388
Cada dia C++!!
|
Probe y si funciona pero no comprendo bien que sucede... read() devuelve un flujo, cierto? Cuando haces: while(!ent.eof() && ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas)))
aca la segunda condicion se cumple siempre y cuando no "lea" el eof...? Crei que era lo mismo que: while(ent.good())
Pero nop... Es que acaso el flujo "ent" no se coloca en mal estado cuando lee el EOF?...
|
|
|
En línea
|
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Claro, por eso dije "por lo pronto"; para que puedas ver la lógica del error. En la ultima lectura se establece failbit y ent.read devuelve NULL en lugar de *this, ergo la condición ya no se cumple y por eso los datos no se repiten.
Saludos
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
.:BlackCoder:.
Desconectado
Mensajes: 388
Cada dia C++!!
|
ent.read devuelve NULL en lugar de *this
Gracias , no sabia esa parte, crei que devolvia *this, y si ponia el failbit en mal estado... En la ultima lectura se establece failbit
Pero si en la ultima se establece failbit porque esto no funciona? while(!ent.fail()){ ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas)); cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl; }
Yo creo que ciertamente devuelve null en vez de *this por el error... pero no establece por si sola el failbit en mal estado... Hice esto para usar la condicion con good(), no muestre el de nuevo el ultimo registro... Y no poner la lectura en la condicion del while (se ve raro xD) while(ent.good()){ if (ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas))) cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl; }
Saludos...
|
|
|
En línea
|
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
while(!ent.fail()){ ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas)); cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl; }
Esto no funciona como esperas porque cometes el mismo error que en el código anterior. Cuando ent.read devuelve NULL y se establece failbit, vos todavía estas dentro del bloque de ejecución del ciclo, por lo tanto imprimís una vez mas el contenido que leíste en la pasada anterior. En cuanto a lo de failbit, no lo he probado, pero estoy seguro, de hecho si así no fuese el código anterior seria un ciclo infinito. Prueba revisando los valores de retorno (para eso están ) y quedara mas claro! while(!ent.fail()){ cout<<"Read return value: "<<ent.read(reinterpret_cast<char *> (&aux),sizeof(Personas))<<endl; cout<<aux.getNombre()<<endl<<aux.getEdad()<<endl; }
Saludos
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
.:BlackCoder:.
Desconectado
Mensajes: 388
Cada dia C++!!
|
Ah ya me puse a probar un poco de cosas y vi que el failbit se coloca en true es despues de leer el EOF mas no al momento de leerlo... Gracias por la ayuda me habia quedado trancado con esa duda Saludos...
|
|
|
En línea
|
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Escribir en binario (REG_BINARY) en el Registro de Windows
Programación Visual Basic
|
Hendrix
|
1
|
1,832
|
17 Julio 2006, 21:00 pm
por Hendrix
|
|
|
Introducir valor binario en registro usando VB script
Programación Visual Basic
|
jackl007
|
8
|
6,521
|
19 Julio 2008, 21:44 pm
por Lambda
|
|
|
Escribir valor binario en registro
Programación Visual Basic
|
oskoa
|
2
|
3,445
|
27 Diciembre 2010, 23:18 pm
por oskoa
|
|
|
escribir un archivo para después poder leerlo en matlab
Programación C/C++
|
fafafa01
|
4
|
2,799
|
12 Mayo 2016, 14:56 pm
por fafafa01
|
|
|
Error al querer leer el último registro en archivo .txt [python]
« 1 2 »
Scripting
|
DanielPy
|
16
|
8,717
|
31 Marzo 2018, 08:38 am
por Avispon99
|
|