Manejo de ficheros

Iniciado por Gr1nD3r, 18 Julio 2010, 01:35 AM

0 Miembros y 1 Visitante están viendo este tema.

Gr1nD3r

Antes de nada, el codigo del progrma:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

main(){
   struct{
      char nombre[40];
      int edad;
      char lugarResidencia[100];   
   }persona;
   FILE *fichero;
   char linea[80];
   
   printf("Introduzca nombre: ");
   gets(persona.nombre);
   printf("Introduzca edad: ");
   scanf("%d",&persona.edad);
   getchar();
   printf("Lugar de residencia: ");
   gets(persona.lugarResidencia);

   
   fichero=fopen("gente.dat","w");
   fputs(persona.nombre,fichero);
   fputs(persona.lugarResidencia,fichero);
   fprintf(fichero,"%d",&persona.edad);
   fclose(fichero);
   
   fichero=fopen("gente.dat","r");
   fgets(linea,strlen(persona.nombre)+1,fichero);
   printf("Se llama: ");
   puts(linea);
   fscanf(fichero,"%d",&persona.edad);
   printf("Tiene %d años",persona.edad);
   fgets(linea,strlen(persona.lugarResidencia)+1,fichero);
   printf("\nVive en: ");
   puts(linea);
   system("PAUSE");
   fclose(fichero);
}

El programa funciona perfecto, pero cuando abro el fichero, la variable edad del struct no la guarda bien, y se inventa el valor. ¿Alguien sabe cual puede ser el fallo?
Gracias

cbug

Fijate en los warnings al compilar:

26: warning: format '%d' expects type 'int', but argument 3 has type 'int *'

Deberías de modificar la forma en que pasas el parámetro edad de la estructura.


l.c:(.text+0x30): warning: the `gets' function is dangerous and should not be used.

Pasate por aqui:
https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

nicolas_cof

#2
Gr1nD3r, bienvenid@!

Te recomiendo usar las etiquetas GeSHI o code para postear codigo fuente para que sea mas legible, utiliza el boton modificar

Te invito a que pases por estos temas...

Deberias leer algo sobre escritura y lectura de ficheros, particularmente para empezar te recomiendo que leas estos libros...

> El Lenguaje de Programación C - Brian W. Kernighan, Dennis M. Ritchie
> Cómo Programar en C/C++ - Harvey M. Deitel, Paul J. Deitel

https://foro.elhacker.net/programacion_cc/librospapers_c_and_c-t296234.0.html

main()

gets(...)

https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

No es recomendable hacer llamadas al sistema para hacer una pausa en el programa, ademas sumandole que no es para nada portable

Salu10.

Gr1nD3r

Otra pregunta: Que compiladores usais???

nicolas_cof

Gr1nD3r, utilizo GCC en GNU/Linux

Si usas Windows te recomiendo usar el compilador de VisualC++, MinGW o Cygwin (estos 2 ultimos son GCC, en sus versiones para Microsoft)

Por favor te ruego no usar el compilador de Borland ;D

Salu10.

Gr1nD3r

Ok. Yo siempre he utilizado Dev-C++ con Mingw

cbug

Cita de: Gr1nD3r en 18 Julio 2010, 02:18 AM
Ok. Yo siempre he utilizado Dev-C++ con Mingw

También uso gcc. Que raro, en el ide no te mostraba los warnings?  :-\

Gr1nD3r

K va. No me muestra ningun Warning

cbug

Te recomiendo CodeBlocks.