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.
read() coge los X bytes de la estructura. No tienes que poner seekg() en el for.
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!!
Si quieres ir a un byte concreto de archivo, puedes usar simplemente seekg(N), donde n es el byte.
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;
Exactamente en qué instrucción se cierra?
¿Se cierra con error?
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);
}
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);
}
es cierto es asi !! me ha corrido parcialmete bien pero por que el archivo me lee dos veces el primer registro ?
Acabo de corregirlo, poniendo el seekg() al principio del bucle. En cualquier caso, no necesitas el seekg(), prueba prescindiendo de él.
no lo he hecho pero como puedo prescindir de este si quiero avanzar entre los diferentes objetos dentro del archivo.?
Al leer del archivo, el puntero que guarda el streambuff se va moviendo automáticamente, sin que hagas seekg().