[C con Clase] Ficheros

Steven Davidson srd4121 en njit.edu
Mie Ene 19 20:22:37 CET 2011


Hola Alejandro,

On 1/19/2011 1:41 PM, Alejandro Cuervo Huertas wrote:
> Hola
>

[CORTE]

> Les facilito una parte de mi codigo apenas para lo pedido;
>

Veamos el código fuente.

> #include <stdlib.h>

Deberías usar el nombre estándar de ANSI C++ que en este caso es, <cstdlib>.

[CORTE]

> if (a == '1') /// Esta es la parte donde entro los contactos he
> intentado modificar en la parte de sizeof tanto en la parte de donde
> va contacts y me sigue pasando lo mismo.
> {
> int i=0;
>
> while( i<= 25)
> {
> ifstream fentrada("Record.dat",
> ios::in | ios::trunc | ios::binary);

Aquí está el problema. En cada iteración del bucle 'while', estás 
creando y destruyendo el objeto 'fentrada'. Como se trata de un objeto 
que representa un canal asociado a un fichero, el cursor interno siempre 
apuntará al comienzo. Por lo tanto, la lectura posterior siempre leerá 
el primer contacto.

Además, no es una solución optimizada el crear y destruir objetos 
continuamente, especialmente cuando se trata de ficheros. Sugiero crear 
el objeto antes de entrar en este bucle y cerrarlo después de terminarlo.

Por cierto, no veo que necesites 'ios::trunc', porque no querrás truncar 
(borrar) el fichero.

> fentrada.read(reinterpret_cast<char *>(&Contacts[i]), sizeof(personas));
> if (Contacts[i].Name[0] == 0) {fentrada.close(); break;}
> i++;
> fentrada.close();
> }
>
>
> if (i <= 25)
> {
>
>
> ofstream fsalida("Record.dat",
> ios::out | ios::binary);
>

Aquí reabres el fichero para la escritura. Esto te lo podrías haber 
ahorrado si abrieres el objeto original en ambos modos: lectura y escritura.

Tienes el mismo problema más abajo para el caso de: a == '4'.


Espero que esto te ayude.

Steven





Más información sobre la lista de distribución Cconclase