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

Steven Davidson steven en conclase.net
Vie Mar 30 03:00:05 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


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