[Ayuda] Ficheros en C

Iniciado por sora_ori, 7 Junio 2014, 12:40 PM

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

sora_ori

Muy buenas a todos, estoy haciendo un programa en C que añade trabajadores, los guarda en un fichero, los muestras, los modifica etc.

Me funcionan muchas cosas pero otras no, consigo añadir datos en un fichero y guardarlos en un fichero, pero cuando voy a mostrar el fichero por pantalla no se me muestra nada.



A ver si alguien sería tan amable de ayudarme jejeje

Gracias!



rir3760

Con solo ese fragmento no es posible conocer donde se genera el error, hay que revisar todo el código fuente en particular las otras funciones que acceden al archivo (por ejemplo donde se crea y escribe en el).

En cuanto a la función "mostrarTreballadors" falta indicar el valor de retorno (si no piensas utilizarlo hay que cambiar este a void) y algunos detalles todos ellos menores.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

sora_ori

#2
Hola "rir3760" gracias por ayudar.


EDITO: Ya he podido listar el contenido de un fichero, aunque agrego más de 1 trabajador en el fichero y solo consigo mostrar 1 resultado. Dejo imagen:




Código actual:


rir3760

Hay que realizar una cantidad importante de cambios al programa. Comentarios:

* No es necesario incluir los encabezados <windows.h> y "fcntl.h" en el programa, eliminalos.

* Se debe evitar el uso de fflush(stdin) y las funciones como getch parte de la biblioteca conio de Borland. Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

* Evita macros como esta:
#define PRS(x) printf ("%s\n",x)
Ya que no facilitan la lectura del código fuente, en su lugar utiliza printf directamente.

* Salvo "nouTreballador" en todas las funciones falta el valor de retorno y ya que este no se utiliza deberías cambiar los prototipos indicando que el tipo de retorno es void.

* También debes indicar que las funciones (salvo una) no reciben argumentos mediante la palabra reservada void entre paréntesis:
int nouTreballador(void);
int GravarDades(int num_regs);
int mostrarTreballadors(void);
int modificarDades(void);
int ficheroLog(void);

No debes utilizar "()" ya que ello indica un numero no determinado de argumentos

* En la función main al pedir la opción:
printf("Escoge una opcion: ",opc);
scanf("%d",&opc);

En la llamada a printf el segundo argumento "opc" y la coma antes de este están de mas, eliminalos.

* En la misma función las variables "continua", "i" y "dadesVector" no se utilizan, eliminalas.

* En la definición de la función "GravarDades" falta indicar el tipo del parámetro.

* El error que mencionas se genera (supongo ya que no puedo ejecutar tu programa) en la función "mostrarTreballadors", en ella tienes un error lógico (la falta de llaves para indicar el cuerpo del bucle):
int mostrarTreballadors(void)
{
   treballadors treb;
   system("cls");
   FILE *fp;
   
   if ((fp = fopen ("treballador.dat","rb")) == NULL){
      puts("\nNo puc obrir l'arxiu clubs.dat");
      system("pause");
   }else {
      /* bucle */
      while (fread (&treb, mida, 1, fp) == 1)
         printf("______________________________________________________________________________\n\n");
      /* bucle */
     
      printf("TRABAJ.\tCLIENTE\t   DNI  \tANYO\tCATEGORIA\tSUELDO\n");
      printf("______________________________________________________________________________\n");
      printf("\n%s \t%s \t %i \t%i \t%s   \t%i ", treb.nomTreballador, treb.cognomClient, treb.dni, treb.any, reb.categoria, treb.sou);
     
      printf("\n_____________________________________________________________________________\n");
      printf("\n\n\nEstos son todos los trabajadores leidos del fichero treballador.dat");
      getch();
      fclose(fp);
   }
}


* La variable "mida" la declaras en dos ocasiones una de forma "global" al inicio del programa y otra vez con el mismo valor en la función "modificarDades", hay que eliminar esta ultima.

* En la misma función no es necesario utilizar strlen para conocer si la cadena almacenada es una cadena vacía, en su lugar basta con verificar si el primer elemento de la cadena es '\0'.

* Algunos mas ...

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

sora_ori

#4
Duda solucionada!