Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con ficheros

Estas en el tema de Problema con ficheros en el foro de C/C++ en Foros del Web. Buenas, tengo una especie de agenda hecha en c y me gustaria guardar los datos en un fichero que luego pueda leer. El codigo que ...
  #1 (permalink)  
Antiguo 10/12/2010, 14:11
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Problema con ficheros

Buenas, tengo una especie de agenda hecha en c y me gustaria guardar los datos en un fichero que luego pueda leer. El codigo que tengo es este:

Código C:
Ver original
  1. [QUOTE]#include <stdio.h>
  2. #include <stdlib.h>
  3. #include "agenda.h"
  4. int main(){
  5.   FILE *f;
  6.   int opcion, i=0;
  7.   struct agenda ag;
  8.   inicializar_agenda(&ag);
  9.   do{
  10.   printf("\n1.-Añadir contacto");
  11.   printf("\n2.-Buscar contacto");
  12.   printf("\n3.-Mostrar todos los contactos");
  13.   printf("\n4.-Abrir agenda guardada");
  14.   printf("\n5.-Salir");
  15.   printf("\n¿que quiere hacer? ");
  16.   scanf("%d", &opcion);
  17.   switch(opcion){
  18.   case 1:
  19.     [B]f = fopen ("agenda.bin", "wb");
  20.     if (f == NULL) {
  21.      printf ("Error abriendo alumnos.dat\n") ;
  22.      return 1 ;
  23.      }
  24.     anyadir_contacto(&ag);
  25.     fwrite (&ag, sizeof(ag), 1, f);
  26.     fclose(f);[/B]
  27.   break;
  28.   case 2:
  29.     if (esta_vacia(ag))
  30.       printf("La agenda esta vacia");
  31.     else
  32.       mostrar_contacto(ag);
  33.   break;
  34.   case 3:
  35.     listar(ag);
  36.     break;
  37.   case 4:
  38.     [B]f = fopen ("agenda.bin", "rb");
  39.     while (fread(&ag, sizeof(ag), 1, f) > 0)
  40.       for(i=0;i<ag.numContactos;i++)
  41.       fprintf(f,"%s %d %s %s\n", ag.conjunto[i].nombre, ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;[/B]
  42.   }
  43.   }while(opcion!=5);
  44.   return 0;  
  45. }
  46.     [/QUOTE]

El fichero se crea en el caso 1, pero luego no lo saca por pantalla en el caso 4 ¿Que puede estar mal?

Última edición por mikelalos; 10/12/2010 a las 14:34
  #2 (permalink)  
Antiguo 10/12/2010, 16:28
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema con ficheros

PRobaste abrir el archivo si escribe o no?? el archivo se crea??

Podemos poner la funcion anyadir_contacto. Creeria que el error viene de ahi.
  #3 (permalink)  
Antiguo 10/12/2010, 23:10
 
Fecha de Ingreso: marzo-2009
Mensajes: 74
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Problema con ficheros

· r abre un fichero para lectura. Si el fichero no existe devuelve error.
· w abre un fichero para escritura. Si el fichero no existe se crea, si el
fichero existe se destruye y se crea uno nuevo.
· a abre un fichero para añadir datos al final del mismo. Si no existe
se crea.
· + símbolo utilizado para abrir el fichero para lectura y escritura.
· b el fichero es de tipo binario.
· t el fichero es de tipo texto. Si no se pone ni b ni t el fichero es de
texto. Los modos anteriores se combinan para conseguir abrir
el fichero en el modo adecuado.

Yo meteria mejor esto si no a cada rato borras el contenido de tu archivo te dejo las aperturas de archivos

Código C++:
Ver original
  1. case 1:
  2.     [B]f = fopen ("agenda.bin", "ab");
  3.     if (f == NULL) {
  4.      printf ("Error abriendo alumnos.dat\n") ;
  5.      return 1 ;
  6.      }
  7.     anyadir_contacto(&ag);
  8.     fwrite (&ag, sizeof(ag), 1, f);
  9.     fclose(f);[/B]
  10.   break;
  #4 (permalink)  
Antiguo 11/12/2010, 04:41
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Problema con ficheros

Cita:
Iniciado por sam90 Ver Mensaje
PRobaste abrir el archivo si escribe o no?? el archivo se crea??

Podemos poner la funcion anyadir_contacto. Creeria que el error viene de ahi.
La funcion funciona bien, no creo que esté ahi el problema porque el archivo se crea y se escribe en el. El problema es cuando le doy la orden de sacarlo por pantalla que no hace absolutamente nada.

Cita:
Iniciado por vnvnation Ver Mensaje
· r abre un fichero para lectura. Si el fichero no existe devuelve error.
· w abre un fichero para escritura. Si el fichero no existe se crea, si el
fichero existe se destruye y se crea uno nuevo.
· a abre un fichero para añadir datos al final del mismo. Si no existe
se crea.
· + símbolo utilizado para abrir el fichero para lectura y escritura.
· b el fichero es de tipo binario.
· t el fichero es de tipo texto. Si no se pone ni b ni t el fichero es de
texto. Los modos anteriores se combinan para conseguir abrir
el fichero en el modo adecuado.

Yo meteria mejor esto si no a cada rato borras el contenido de tu archivo te dejo las aperturas de archivos

Código C++:
Ver original
  1. case 1:
  2.     [B]f = fopen ("agenda.bin", "ab");
  3.     if (f == NULL) {
  4.      printf ("Error abriendo alumnos.dat\n") ;
  5.      return 1 ;
  6.      }
  7.     anyadir_contacto(&ag);
  8.     fwrite (&ag, sizeof(ag), 1, f);
  9.     fclose(f);[/B]
  10.   break;
Gracias por el consejo, ya lo he cambiado.
  #5 (permalink)  
Antiguo 11/12/2010, 05:38
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Problema con ficheros

Cita:
Iniciado por mikelalos Ver Mensaje
El fichero se crea en el caso 1, pero luego no lo saca por pantalla en el caso 4 ¿Que puede estar mal?
el error es que has utilizado fprintf() que sirve para ESCRIBIR en el fichero, en vez de utilizar fscanf() para LEER del fichero. Luego tienes que usar un printf() para escribir por pantalla lo que has leido.
  #6 (permalink)  
Antiguo 11/12/2010, 07:18
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Problema con ficheros

Cita:
Iniciado por Munire Ver Mensaje
el error es que has utilizado fprintf() que sirve para ESCRIBIR en el fichero, en vez de utilizar fscanf() para LEER del fichero. Luego tienes que usar un printf() para escribir por pantalla lo que has leido.
Lo he hecho como tu dices y lo que hace ahora es sacar un 0 por pantalla

Código C:
Ver original
  1. f = fopen ("agenda.bin", "rb");
  2.     while (fread(&ag, sizeof(ag), 1, f) > 0){
  3.       for(i=0;i<ag.numContactos;i++)
  4.       fscanf(f,"%s %d %s %s\n", ag.conjunto[i].nombre, &ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;
  5.       printf("%s %d %s %s\n", ag.conjunto[i].nombre, ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;
  6.     }
  #7 (permalink)  
Antiguo 11/12/2010, 09:04
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Problema con ficheros

Código C:
Ver original
  1. for(i=0;i<ag.numContactos;i++)
  2.       fscanf(f,"%s %d %s %s\n", ag.conjunto[i].nombre, &ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;
  3.       printf("%s %d %s %s\n", ag.conjunto[i].nombre, ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;
Mucho cuidado con no poner llaves por que es engañoso. parece que el for abarca hasta el printf pero NO ES ASI.

Lo que has escrito es igual a esto:
Código C:
Ver original
  1. for(i=0;i<ag.numContactos;i++)
  2. {
  3.     fscanf(f,"%s %d %s %s\n", ag.conjunto[i].nombre, &ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;
  4. }
  5. printf("%s %d %s %s\n", ag.conjunto[i].nombre, ag.conjunto[i].telefono, ag.conjunto[i].email, ag.conjunto[i].web) ;

el no poner llaves (para for, if...) solo se puede hacer si vas a poner una sola sentencia.

Por ejemplo este sencillo programa:
Código C:
Ver original
  1. int main()
  2. {
  3.     int i=1;
  4.     if(i==0)
  5.         printf("#####");
  6.         printf("#");
  7.  
  8.     system("pause");
  9.     return 0;
  10. }
la salida es: #
  #8 (permalink)  
Antiguo 11/12/2010, 09:21
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Problema con ficheros

Ya lo tengo solucionado
  #9 (permalink)  
Antiguo 11/12/2010, 09:39
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Problema con ficheros

de nada
  #10 (permalink)  
Antiguo 11/12/2010, 09:42
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Problema con ficheros

Cita:
Iniciado por Munire Ver Mensaje
de nada
Perdona, he escrito sin leer tu mensaje.

Gracias a todos los que me habeis aportado algo.
  #11 (permalink)  
Antiguo 11/12/2010, 11:41
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Problema con ficheros

entonces era eso lo que pasaba (lo que he escrito mi ultimo mensaje)?
  #12 (permalink)  
Antiguo 11/12/2010, 12:08
 
Fecha de Ingreso: enero-2004
Mensajes: 11
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Problema con ficheros

Cita:
Iniciado por Munire Ver Mensaje
entonces era eso lo que pasaba (lo que he escrito mi ultimo mensaje)?
Aparte de eso estaba utilizando instrucciones para trabajar con ficheros de texto y el fichero es binario.

Etiquetas: ficheros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:39.