Ver Mensaje Individual
  #5 (permalink)  
Antiguo 20/08/2014, 01:17
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 4 meses
Puntos: 10
Respuesta: Problema con tellg() - Archivos

Hola de nuevo:

Bueno, es la segunda vez que edito el post, ya que no atinaba con la respuesta correcta.
Aprovecho para corregir también la primera respuesta, ya que intuía que no era correcta.
Bueno, el caso es que creo que el motivo por el que no funcionaba seekg()/tellg() era porque no estaba bien el metodo de escritura, y se activaba el flag de error.
Prueba con estas líneas en tu código:
Código C++:
Ver original
  1. if (archivo.fail())
  2.     {
  3.         cout<<"Limpiar flags"<<endl;
  4.     }
  5.     archivo.clear();

Si hay error, te mostrará el mensaje y se limpiará el flag de error.

Sobre la duda, el problema es que al hacer la escritura, reservas el tamaño de P (12 bytes) y al hacerlo dentro del bucle, reservas un total de 3*12 bytes, que son los 36 bytes.
Creo que éste código corrige los errores, y de paso hace uso de un archivo para lectura/escritura, que es lo que querías y que yo equivocadamente te indiqué que no era posible:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5. class prueba
  6. {
  7.     int p;
  8. public:
  9.     void escribir();
  10.     void leer();
  11. };
  12.  
  13. void prueba::escribir()
  14. {
  15.     cin>>p;
  16. }
  17. void prueba::leer()
  18. {
  19.     cout<<"Numero: "<<p<<endl;
  20. }
  21.  
  22.  
  23. int main(int argc, char *argv[])
  24. {
  25.     prueba P[3];
  26.     prueba P2[3];
  27.    
  28.     fstream archivo ("probar", ios::in | ios::out | ios::trunc | ios::binary);
  29.  
  30.     for(int i=0; i<3; i++)
  31.         {
  32.             cout<<"Numero "<<i+1<<": ";
  33.             P[i].escribir();
  34.             archivo.write(reinterpret_cast<char *>(&P[i]), sizeof(prueba));
  35.         }
  36.     archivo.seekg(0);
  37.     archivo.read(reinterpret_cast<char *>(&P2), sizeof(prueba)*3); //archivo.read(reinterpret_cast<char *>(&P2), sizeof(P));
  38.     for(int i=0; i<3; i++)
  39.         {
  40.             P2[i].leer();
  41.         }
  42.  
  43.     int L = sizeof(P);
  44.  
  45.     cout<<"\n";
  46.  
  47.     cout<<"Longitud archivo: "<<L;
  48.     cout<<"\n";
  49.  
  50.     int m;
  51.     cout<<"Ingresar numero de objeto: ";
  52.     cin>>m;
  53.     int pos = (m-1) * sizeof(P[0]);
  54.  
  55.     //cout.setf(ios::hex, ios::basefield);
  56.     cout<<"Posicion Objeto: "<<pos<<"\n";
  57.     if (archivo.fail())
  58.     {
  59.         cout<<"Limpiar flags"<<endl;
  60.     }
  61.     archivo.clear();
  62.  
  63.     archivo.seekg(0L, ios::beg);
  64.     int start = archivo.tellg ();
  65.     cout<<"Start: "<<start<<endl;
  66.  
  67.     archivo.seekg (0L, ios :: end);
  68.     int end = archivo.tellg ();
  69.     cout<<"End: "<<end<<endl;
  70.     int size = (end - start);
  71.     cout<<"Size: "<<size<<endl;
  72.  
  73.     archivo.seekg(0, ios::end);
  74.     long TamTotal = archivo.tellg();
  75.     cout<<"Tamanio Total: "<<TamTotal;
  76.     cout<<"\n";
  77.     int CantObj = TamTotal/L;
  78.     cout<<"Cantidad de Objetos: "<<CantObj;
  79.  
  80.     archivo.close();
  81.  
  82.     return 0;
  83. }

Última edición por dehm; 20/08/2014 a las 02:26 Razón: Primera respuesta incorrecta