[C con Clase] Guardar y Leer Ficheros :-/

Alan Manosalva alandavidmc en hotmail.com
Vie Mar 30 08:44:17 CEST 2007


Hola Alan,

El pasado 2007-03-29 22:11:15, alan escribió:

a> Hola a todos, agradeciendo de antemano su ayuda, quiciera que vean este
codigo y me digan cual es el error porque no veo donde pueda estar cuando lo
ejecuto (en visual C++ y en Dev-C++) me da un error (imprime basura) cuando
llega al numero 26 (sin importar de donde empiece de 0 otro numero antes)  y
se repite cada 256 numeros.

Veamos el código fuente.

a> #include <iostream>

Deberías incluir <cstdio>, ya que no usas <iostream>.

a> using namespace std;
a> #define TAM 290
a> typedef struct stDATOS
a> {
a> int edad; //si aca cambio a float el error aparece mas adelante
a> char nombre[40];
a> } DATOS;

Bajo C++, no es necesario crear un tipo de dato para una estructura.

a> int main()
a> {
a> FILE *arch;
a> DATOS datosG, datosA[TAM];
a> arch = fopen("prueba.txt", "w");
a> for(int i = 0; i < TAM; i++)
a> {
a> datosG.edad = (int)i;
a> sprintf(datosG.nombre, "Alan David Manosalva Cordova_%i", datosG.edad);
a> fseek(arch, i*sizeof(DATOS), SEEK_SET);

Aunque esto sea correcto, no es necesario. Una vez abierto un fichero, éste
ya contiene un "cursor" que indica la posición para la siguiente operación:
lectura o escritura. Por lo tanto, no es necesario ir recolocando el cursor,
ya que después de cada lectura o escritura, el cursor es actualizada
automáticamente.

a> fwrite(&datosG, sizeof(DATOS), 1, arch);
a> }
a> fclose(arch);
a> arch = fopen("prueba.txt", "r");
a> for(i = 0; i < TAM; i++)

Esto es un error, ya que no has declarado 'i' en este ámbito.

a> {
a> fseek(arch, i*sizeof(DATOS), SEEK_SET);

Nuevamente, aquí ocurre lo mismo que antes; no es necesario.

a> fread(&datosA[i], sizeof(DATOS), 1, arch);

En este caso, no aconsejo leer cada registro, ya que tenemos un array. Para
eso, leemos todos los registros de golpe. Esto es,

arch = fopen( "prueba.txt", "r" );
fread( datosA, sizeof(DATOS), TAM, arch );
fclose( arch );

Como puedes ver, no es necesario tener un bucle 'for'. Leemos toda la
información de una sentada.

a> }
a> fclose(arch);
a> for(i = 0; i < TAM; i++)
a> printf("%s - %i\n", datosA[i].nombre, datosA[i].edad);
a> return 0;
a> }

El problema que veo es que estás usando las funciones 'fwrite()' y 'fread()'
que son más apropiadas para ficheros binarios. Como estás manejando un
fichero de texto, deberías usar funciones como 'fprintf()' y 'fscanf()'. Con
estas funciones sí tendrás que leer y escribir la información en cada
iteración.

Espero que esto te ayude.

Steven
-------------------------------------------------------
Primero que todo gracias por la por la respuesta que me ayudo a solucionar
mi problema, pero me gustari aclarar algunas cosas:

1) Yo defino el tipo de dato para poder crear variables mas facilmente.
2) La funcion fseek la utilice para probar si solucionaba mi problema pero
luego olvide sacarla =P
3) En Visual C++ cuando defino una variable en un for y luego lo vuelvo a
definir en otro me da un error de redefinicion
4)Yo use fwrite y fread porque deseaba grabar registros en este caso la
estructura DATOS, pero my error fue abrir el archivo de como texto y no como
binario cambiando esto solucione el problema.
5) No lei toda el contenido de golpe en el array de registros porque estaba
probando si se podia hacer de uno en uno porque quiero usar este algoritmo
para llenar una lista enlazada leyendo cada nodo uno por uno y agregandolo a
la lista, aunque no si es la forma correcta de hacerlo.

Muchas gracias por sua atencion me gustaria que me digeran si el algoritmo
que trato de usar para grabar y leer una lista enlazada es correcta.





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