Autor
|
Tema: structura en c++ registro binarios ,Archivos (Leído 5,322 veces)
|
bash
Desconectado
Mensajes: 258
|
buenas a todos !! tengo una dudad estoy haciendo un app que guarda un estructura en un archivo (los datos) bien , la aplicacion toma los datos desde la consola luego los concatena con los que estan en el fichero ahora quiero tambien leer desde la estructura y me resulta medio dificil posteo el codidgo para ver si alguien me puede dar una mano por favor. #include <iostream> #include <fstream> #include <vector> using namespace std; struct prueba{ int r; }; void escribir(struct prueba t){ fstream salida("test.b" , ios::out|ios::binary|ios::app|ios::ate); salida.write(reinterpret_cast<char *>(&t), sizeof(prueba)); cout <<"Registro Escrito Exitosamente."<<endl; salida.close(); } int main() { prueba re; re.r =1; escribir(re); re.r =2; escribir(re); re.r =3; escribir(re); re.r =4; escribir(re); re.r =1; escribir(re); re.r =1; escribir(re); int l; cout <<"\n pulse la tecla de enter"<<endl; cin.get(); fstream entrada("test.b", ios::in|ios::binary); entrada.seekg(0,entrada.end); l = entrada.tellg(); int cnd = l/sizeof(prueba); entrada.seekg(0,entrada.beg); cout <<"la longitud del fichero es : "<< cnd; cin.get(); vector<prueba> pr; prueba obj; for(int f= 1; f < cnd; f++) { entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba)); pr.push_back(obj); entrada.seekg(cnd*f, entrada.cur); } entrada.close(); for(int g=0;g< pr.size(); g++) cout << "value : "<< pr.at(g).r<<endl; cin.get(); cin.get(); return 0; }
me gustaria que alguien explique por lo menos como puedo desplazar seekg() por que lo he intentao varias veces de diferente modos y me da tamanos waoo ...y he buscado por internet pero no he encotrado nada que comprenda.. :'( Gracias Y disculpen la molestia.
|
|
« Última modificación: 8 Abril 2015, 19:04 pm por dummy001 »
|
En línea
|
gracias por responder mis dudas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
read() coge los X bytes de la estructura. No tienes que poner seekg() en el for.
|
|
|
En línea
|
|
|
|
bash
Desconectado
Mensajes: 258
|
si eso lo se gracias ahora bien , como te has fijado el archivo el archivo cada vez que el programa se abre crea un registro entonces deseo ir registro por registro y copiarlo en la estructura y luego cargarlo en el vector entonces por eso uso seekg()
por que me gustaria que se mueva entre los registros y asi poder copiarlo. se entiende? Gracias por tomarme en cuenta!!
|
|
|
En línea
|
gracias por responder mis dudas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Si quieres ir a un byte concreto de archivo, puedes usar simplemente seekg(N), donde n es el byte.
|
|
|
En línea
|
|
|
|
bash
Desconectado
Mensajes: 258
|
esta bien entendi eso pero por que al llegar a este punto el programa se cierra: fstream entrada("test.b", ios::in|ios::binary); entrada.seekg(0,entrada.end); l = entrada.tellg(); int cnd = l/sizeof(prueba); entrada.seekg(0,entrada.beg); cout <<"la longitud del fichero es : "<< cnd; cin.get(); vector<prueba> pr; prueba obj; for(int f= 1; f < cnd; f++) { ////////////////Aqui entrada.read(reinterpret_cast<char*>(&obj),sizeof(prueba)); pr.push_back(obj); entrada.seekg(l*f); } /// entrada.close(); for(int g=0;g< pr.size(); g++) cout << "value : "<< pr.at(g).r<<endl;
|
|
|
En línea
|
gracias por responder mis dudas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Exactamente en qué instrucción se cierra? ¿Se cierra con error?
|
|
|
En línea
|
|
|
|
bash
Desconectado
Mensajes: 258
|
cuando trataba de leer!! lo resolvi aunque no me di cuenta cual era el error ahora creo que avanze por que me lee dos registros pero si tengo 24 registro y me cuenta el tamanao y todo pero solo me lee dos cambie el for un poco!! for(int f= sizeof(prueba); f < cnd*(sizeof(prueba)); f += f) { entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) ); pr.push_back(obj); entrada.seekg(sizeof(prueba),ios::beg); }
|
|
|
En línea
|
gracias por responder mis dudas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Haces operaciones absurdas fon 'f', y nunca la utilizas. Simplemente: for(int i=0; i<cnd; i++) { entrada.seekg(i*sizeof(prueba)); entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) ); pr.push_back(obj); }
|
|
« Última modificación: 9 Abril 2015, 16:41 pm por ivancea96 »
|
En línea
|
|
|
|
bash
Desconectado
Mensajes: 258
|
es cierto es asi !! me ha corrido parcialmete bien pero por que el archivo me lee dos veces el primer registro ?
|
|
|
En línea
|
gracias por responder mis dudas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Acabo de corregirlo, poniendo el seekg() al principio del bucle. En cualquier caso, no necesitas el seekg(), prueba prescindiendo de él.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Leer datos binarios del registro
Programación Visual Basic
|
Kizar
|
6
|
4,314
|
17 Julio 2006, 23:31 pm
por Kizar
|
|
|
Archivos Binarios
Programación Visual Basic
|
David Vans
|
5
|
2,270
|
14 Octubre 2006, 19:32 pm
por Nymphetaminito
|
|
|
Archivos Binarios
.NET (C#, VB.NET, ASP)
|
David Vans
|
2
|
3,515
|
1 Junio 2007, 13:45 pm
por »~^~«CkNU!»~^~«
|
|
|
Archivos binarios en VB6???
Programación Visual Basic
|
Bb-7
|
1
|
3,963
|
10 Abril 2008, 17:26 pm
por krackwar
|
|
|
Archivos Binarios
Programación Visual Basic
|
TheGhost(Z)
|
0
|
1,687
|
21 Agosto 2010, 16:24 pm
por TheGhost(Z)
|
|