¿Por que da error esto?

Started by Danielo515, January 03, 2011, 06:44:29 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

Me parece un programa demasiado simple como para fallar.

La primera vez que lo ejecuto no pasa nada,  pero a la segunda ya da error.

Está en c++

[code language="cpp"]#include<iostream>
#include<fstream>
#include<string>
using namespace std;

struct _soporte {
       long id_num;
       string titulo;
       //string autor;       

       };
       

void escribir();
void leer();


int main(){
   escribir();
   leer();
   
   getchar();
   
}

   
void escribir(){
     ofstream datos;
     _soporte libro;
     

     datos.open("datos.dat", ios::app|ios::binary);
     
     cout<<"Titulo: "<<endl;
     getline(cin, libro.titulo);
     
     libro.id_num=99;//datos.tellp();    //la id corresponde a la posición donde empieza el registro
     
     cout<<"Grabando: "<<libro.titulo<<" "<<libro.id_num<<endl;
     datos.write(reinterpret_cast<char *> (&libro),sizeof(_soporte));
     
     datos.close();
     
     }
     
     
void leer(){
     ifstream lee;
     _soporte libro;
     
     
     lee.open("datos.dat",ios::in|ios::binary);
   
     
     while(!lee.eof()){
             
             lee.read(reinterpret_cast<char *> (&libro),sizeof(_soporte));
             
             cout<<"ID: "<<libro.id_num<<endl;
             cout<<"Titulo:"<<libro.titulo<<endl;
             cout<<"pos: "<<lee.tellg()<<endl;
     }
     
     lee.close();
     
     }[/code]

FreeYourMind

Tienes todo el código ahí ? Puede ser porque no lo abres en modo lectura/escritura o que se quede pillado. Deberias probar sólo la de escribir 2 veces seguidas para intentar ver donde falla.

Danielo515

Quote from: FreeYourMind on January 03, 2011, 08:55:21 AM
Tienes todo el código ahí ? Puede ser porque no lo abres en modo lectura/escritura o que se quede pillado. Deberias probar sólo la de escribir 2 veces seguidas para intentar ver donde falla.

Si, el programa es tan corto como ves, no hay más código ya que es una prueba precisamente de eso.

A que te refieres, a que escriba dos veces en una ejecución ¿no? vale, me pondré a ello a ver que pasa.

FreeYourMind

intenta probar sólo con la funcion escribir varias veces, si no falla entonces es la de lectura.

Danielo515

El problema está, por lo visto, en que las strings son un tipo de puntero a char, y hay que hacer unas cuantas operaciones con ellas antes de grabar la estructura. Al grabar no da error, pero al leer si, claro.

Alguien sabe decirme como abrir un fichero para escribir al final,  y que la función que te dice la posición del puntero, funcione como dios manda?

Drumpi

¿Te refieres a FSEEK?

Lo poquísimo que he visto de ficheros en C es muy similar a Bennu, incluso se pueden usar las mismas funciones... o muy similares. Sin embargo yo vi los ficheros más a fondo en C++, usando las operaciones simillares a CIN y COUT (o sea, >> y <<, y puede que simplifique las cosas).

De todos modos, hasta donde sé, las strings no son un tipo de dato, son un puntero de tamaño INT a una cadena de bytes de tamaño variable, que se manejan usando unas funciones muy específicas. Nunca llegué a tener nivel para manejarlas, así que sienpre hemos usado arrays de CHAR (o listas enlazadas en su defecto).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)