Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23/10/2014, 17:25
Ch3Ch0
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Problema con tellg() - Archivos

Cita:
Iniciado por dehm Ver Mensaje
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. }
Hola, dehm, primero que nada perdon que no haya respondido antes pero gracias por responder y darme la solucion correcta. Lo unico que me quede pensando es en porque declaraste dos arreglos,
yo probe el codigo con un solo arreglo y metiendo archivo.read(reinterpret_cast<char *>(&P[i]), sizeof(prueba)*3); de esta forma dentro del bucle for adonde se encuentra .leer() y me funciono igual,
lo que no se es si lo que hice es lo correcto pero en si mi pregunta es porque dos arreglos y no uno.
Por lo demas ninguna duda y por cierto si no se puede volver a responder a un post despues de un tiempo(me ausente un par de meses) pido disculpas y haganmelo saber. Saludos