Ver Mensaje Individual
  #2 (permalink)  
Antiguo 16/08/2014, 09:43
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 3 meses
Puntos: 10
Respuesta: Problema con tellg() - Archivos

Hola:
A ver si alguien te puede dar una explicación más técnica de como se comportan los objetos fstream.
Mientras, lo único que te puedo decir es que seekp() y tellp() son métodos de ostream.
Así que te puede funcionar esto. Es crear un objeto ifstream para la creación y llenado del archivo, y un objeto ofstream para su lectura:

Código C++:
Ver original
  1. int main(int argc, char *argv[])
  2. {
  3.     prueba P[3];
  4.     ofstream archivo ("probar", ios::out | ios::binary);
  5.  
  6.     for(int i=0; i<3; i++)
  7.         {
  8.             cout<<"Numero "<<i+1<<": ";
  9.             P[i].escribir();
  10.             archivo.write((char *) &P, sizeof P);
  11.         }
  12.     archivo.close();
  13.  
  14.     ifstream archivo2 ("probar", ios::in | ios::binary);
  15.  
  16.     for(int i=0; i<3; i++)
  17.         {
  18.             archivo2.read((char *) &P, sizeof P);
  19.             P[i].leer();
  20.         }
  21.  
  22.     int L = sizeof(P);
  23.  
  24.     cout<<"\n";
  25.  
  26.     cout<<"Longitud archivo: "<<L;
  27.     cout<<"\n";
  28.  
  29.     int m;
  30.     cout<<"Ingresar numero de objeto: ";
  31.     cin>>m;
  32.     int pos = (m-1) * L;
  33.  
  34.     //cout.setf(ios::hex, ios::basefield);
  35.     cout<<"Posicion Objeto: "<<pos<<"\n";
  36.  
  37.  
  38.     archivo2.seekg(0);
  39.  
  40.     int start = archivo2.tellg ();
  41.     cout<<"Start: "<<start<<endl;
  42.     archivo2.seekg (0, ios :: end);
  43.  
  44.     int end = archivo2.tellg ();
  45.     cout<<"End: "<<end<<endl;
  46.     int size = (end - start);
  47.     cout<<"Size: "<<size<<endl;
  48.  
  49.  
  50.  
  51.     archivo2.seekg(0, ios::end);
  52.     long TamTotal = archivo2.tellg();
  53.     cout<<"Tamanio Total: "<<TamTotal;
  54.     cout<<"\n";
  55.     int CantObj = TamTotal/L;
  56.     cout<<"Cantidad de Objetos: "<<CantObj;
  57.  
  58.     archivo2.close();
  59.  
  60.     return 0;
  61. }

Siento no ser de más ayuda. Bueno, también decir que hay que acostumbrase a los casting de C++. En este caso, donde pones:
Código C++:
Ver original
  1. archivo.write((char *) &P, sizeof P);
Código C++:
Ver original
  1. archivo2.read((char *) &P, sizeof P);
habría que hacer:
Código C++:
Ver original
  1. archivo2.write(reinterpret_cast<char *>(&P), sizeof(P));
Código C++:
Ver original
  1. archivo2.read(reinterpret_cast<char *>(&P), sizeof(P));

Última edición por dehm; 16/08/2014 a las 10:02