• Domingo 15 de Diciembre de 2024, 04:29

Autor Tema:  Problema con Archivos  (Leído 3616 veces)

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Problema con Archivos
« en: Lunes 4 de Mayo de 2009, 03:13 »
0
Buenas Tardes

He estado estudiando Lenguaje C y me han surgido una serie de dudas con el tema de manejos de archivos, de antemano les doy las gracias por su orientacion y espero que me puedan ayudar. Las dudas son las siguientes:

Tengo problemas al leer de un archivo con la funcion fscanf() y me gustaria aclarar porque no funciona, estoy tratando de leer 3 datos simultaneos en una sola instruccion pero no me muestra ningun registro. Ya he probado con fgets y va muy bien pero quiero salir de la duda y hacerlo con fscanf(), primero miremos el archivo de texto que tengo:

EL contenido del archivo de texto esta almacenado con la extension .txt pero tambien he probado con .dat (secuencial) y no me funciona:
1 pablo 2300.00
2 german 1200.00
3 rebeca 1000.00
4 Ximena 450.00
5 Sandra 790.00

El codigo del programa es el siguiente: La escritura funciona muy bien pero la lectura no va para nada.

Código: C++
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<string.h>
  4. int main(){
  5.    int cuenta,opc,a=0;;
  6.    char archivo[]="Clientes.txt";
  7.    char Nombre[30];
  8.    float Balance;
  9.    FILE *cfptr;
  10.    while(a!=1){
  11.       printf("nnESCRIBIR EN UN ARCHIVO Y LEER");
  12.       printf("n........1.Escribir.............");
  13.       printf("n........2.Leer.................");
  14.       printf("n........3.Salir................");
  15.       printf("nEscoja la opcion ");
  16.       scanf("%d",&opc);
  17.       switch(opc){
  18.          case 1:printf("nnCrear Archivo");
  19.                 if((cfptr=fopen(archivo,"w"))==NULL)
  20.                    printf("nEl archivo no se pudo abrir");  
  21.                 else{
  22.                    printf("nEntre la Cuenta,Nombre y Blance:n");
  23.                    printf("nEntre EOF para finalzar el archivo");
  24.                    printf("nDato:");
  25.                    fflush(stdin);
  26.                    scanf("%d%s%f",&cuenta,Nombre,&Balance);
  27.                    while(!feof(stdin)){
  28.                       fprintf(cfptr,"%d %s %.2fn",cuenta,Nombre,Balance);
  29.                       printf("nDato:");
  30.                       fflush(stdin);
  31.                       scanf("%d%s%f",&cuenta,Nombre,&Balance);
  32.                    }
  33.                 getch();
  34.                 fclose(cfptr);
  35.                 }
  36.                 break;
  37.          case 2:printf("nnLeer Archivo");
  38.                 if((cfptr=fopen(archivo,"r"))==NULL)
  39.                    printf("nEl archivo no se pudo abrir");  
  40.                 else{
  41.                    printf("n%-10s%-13s%sn","Cuenta","Nombre","Balance");
  42.                    fscanf(cfptr,"%d %s %f",&cuenta,Nombre,&Balance);
  43.                    while(!feof(cfptr)){
  44.                       printf("%-10s%-13s%sn",cuenta,Nombre,Balance);
  45.                       fscanf(cfptr,"%d%s%f",&cuenta,Nombre,&Balance);
  46.                    }
  47.                 getch();
  48.                 fclose(cfptr);
  49.                 }
  50.                 break;
  51.          case 3:printf("nGracias por utilizar este programa");          
  52.                 getch();
  53.                 a=1;
  54.                 break;
  55.         default:printf("nCometio un error, presione tecla para continuar");
  56.                 getch();
  57.                 break;
  58.       }    
  59.    }    
  60. return 0;
  61. }
  62.  

Espero Comentarios

De nuevo Gracias

eternity

  • Miembro activo
  • **
  • Mensajes: 78
  • Nacionalidad: ar
    • Ver Perfil
    • http://lameriendadejuan.blogspot.com/
Re: Problema con Archivos
« Respuesta #1 en: Lunes 4 de Mayo de 2009, 05:35 »
0
usa las etiquetas de codigo


pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #2 en: Lunes 4 de Mayo de 2009, 09:58 »
0
Muy bien eternity utilizando las etiquetas se ve mas claro el codigo, pero aun sigo con el mismo problema un saludo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #3 en: Lunes 4 de Mayo de 2009, 10:30 »
0
Cita de: "pablo_666"
Muy bien eternity utilizando las etiquetas se ve mas claro el codigo, pero aun sigo con el mismo problema un saludo
Es tu obligación poner las etiquetas, de hecho. No seas tan irónico porque el que necesita ayuda eres tú, no nosotros.

Cita de: "pablo_666"
esta almacenado con la extension .txt pero tambien he probado con .dat (secuencial) y no me funciona:
Primero, aclararte que la extensión que tenga el fichero no influye absolutamente en nada. Es información para que Windows sepa de qué formato tiene el fichero.

¿Has probado a especificar la ruta completa del fichero?

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #4 en: Lunes 4 de Mayo de 2009, 16:57 »
0
Hola m0skit0

Disculpa si me mal interpretaste, es q realmente no sabia lo de las etiquetas, sabes probe lo q me dijiste pero me sigue sin funcionar ademas el archivo en teoria se abre ya que sino la el if que controla la apertura del archivo me imprimiria por pantalla que el archivo no se ha podido abrir , te agradezco tus nuevo comentarios Saludos!!

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #5 en: Lunes 4 de Mayo de 2009, 17:41 »
0
Hola de nuevo, he descubierto el error, está en la  linea 44, fui un poco descuidado y hice un copiar pegar mal hecho ya que debo cambiar el tipo de dato que imprime el printf:

debe ser asi:

printf("%-10d%-13s%5fn",cuenta,Nombre,Balance);
                    
y no como estaba antes que era asi:

printf("%-10s%-13s%sn",cuenta,Nombre,Balance);            

Ahora me resta resolver que me lea bien el tipo float ya que no me lo lee bien alguna idea
gracias a todos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #6 en: Lunes 4 de Mayo de 2009, 18:31 »
0
Supongo que te referirás a Balance. Ten en cuenta que lo que lees de un fichero de texto son todo cadenas de caracteres, por tanto no tiene sentido usar directamente %f en printf() porque no es un float, es un char *. Deberías convertir primero la cadena de texto que representa un float a un verdadero float con atof(). Fíjate en el ejemplo que viene en el anterior enlace.

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #7 en: Miércoles 6 de Mayo de 2009, 12:21 »
0
Hola m0skit0

Te cuento que estuve buscando y la funcion fscanf() devuelve un entero cuando le pasas los parametros, asi que por ejemplo cuando el lee la primera linea del archivo de texto que es 1 pablo 2300.00 el me toma el primer dato como entero y no necesito trasnformarlo con la funcion atoi ya que por ejemplo hice pruebas le sume 2 o 3 al primer valor o sea al 1 y efectivamente me lo suma, lo raro es q esa suma tambien afecta al 2300.00 y me pone 2302 no lo entiendo bien ademas me muestra una serie de numeros por lo que no es capaz de entender que es un float, como si no fuera capaz de leer un tipo de dato flotante,  no se si toca hacer casting  algo, ademas en el libro de Deitel lo pone asi entonces no entiendo que es lo que pasa exactamente, que dices alguna sugerencia saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #8 en: Miércoles 6 de Mayo de 2009, 12:49 »
0
Disculpa, no había visto el fscanf()  &lt;_&lt;

¿Qué tal si haces un printf() justo después del fscanf() para ver qué lee realmente?

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #9 en: Miércoles 6 de Mayo de 2009, 15:32 »
0
Hola m0skit0

Primero que todo he cambiado los datos que contiene el archivo por estos mira:

12 lui 23.00
18 kiko 98.00
13 pepe 45.00
11 lulu 67.00
78 poli 51.00

Tambien  cambie el codigo te lo adjunto para que le eches un ojo

Código: C
  1.  
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include<string.h>
  5. int main(){
  6.    int cuenta,opc,a=0,f;
  7.    char archivo[]="Clientes.txt";
  8.    char Nombre[30];
  9.    float Balance;
  10.    FILE *cfptr;
  11.    while(a!=1){
  12.       printf("nnESCRIBIR EN UN ARCHIVO Y LEER");
  13.       printf("n........1.Escribir.............");
  14.       printf("n........2.Leer.................");
  15.       printf("n........3.Salir................");
  16.       printf("nEscoja la opcion ");
  17.       scanf("%d",&opc);
  18.       switch(opc){
  19.          case 1:printf("nnCrear Archivo");
  20.                 if((cfptr=fopen(archivo,"w"))==NULL)
  21.                    printf("nEl archivo no se pudo abrir");  
  22.                 else{
  23.                    printf("nEntre la Cuenta,Nombre y Blance:n");
  24.                    printf("nEntre EOF para finalzar el archivo");
  25.                    printf("nDato:");
  26.                    fflush(stdin);
  27.                    scanf("%d%s%f",&cuenta,Nombre,&Balance);
  28.                    while(!feof(stdin)){
  29.                       fprintf(cfptr,"%d %s %.2fn",cuenta,Nombre,Balance);
  30.                       printf("nDato:");
  31.                       fflush(stdin);
  32.                       scanf("%d%s%f",&cuenta,Nombre,&Balance);
  33.                    }
  34.                 getch();
  35.                 fclose(cfptr);
  36.                 }
  37.                 break;
  38.          case 2:printf("nnLeer Archivo");
  39.                 if((cfptr=fopen(archivo,"r"))==NULL)
  40.                    printf("nEl archivo no se pudo abrir");  
  41.                 else{
  42.                    printf("n%-10s%-13s%sn","Cuenta","Nombre","Balance");
  43.                    while(!feof(cfptr)){
  44.                       //printf("%-10d%-13s%5.2fn",cuenta,Nombre,Balance);
  45.                      // printf("n%d",cuenta);  
  46.                      // printf("n%s",Nombre);  
  47.                      // printf("n%f",Balance);  
  48.                       fscanf(cfptr,"%d%s%.2f",&cuenta,Nombre,&Balance);
  49.                       printf("ndatoCuenta:%d",cuenta);  
  50.                       printf("ndatoNombre:%s",Nombre);  
  51.                       printf("ndatoBalance:%f",Balance);  
  52.                
  53.                     }
  54.                             getch();
  55.                 fclose(cfptr);
  56.                 }
  57.                 break;
  58.          case 3:printf("nGracias por utilizar este programa");          
  59.                 getch();
  60.                 a=1;
  61.                 break;
  62.         default:printf("nCometio un error, presione tecla para continuar");
  63.                 getch();
  64.                 break;
  65.       }    
  66.    }    
  67. return 0;
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  



Ademas hice lo que me dijiste de poner un printf  inmediantamente despues de fscanf() y los resultados que me entrega son estos:

Cuenta    Nombre       Balance

datoC:12
datoN:lui
datoB:-107374176.000000
datoC:23
datoN:.00
datoB:-107374176.000000
datoC:18
datoN:kiko
datoB:-107374176.000000
datoC:98
datoN:.00
datoB:-107374176.000000
datoC:13
datoN:pepe
datoB:-107374176.000000
datoC:45
datoN:.00
datoB:-107374176.000000
datoC:11
datoN:lulu
datoB:-107374176.000000
datoC:67
datoN:.00


Que me dices saludos!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #10 en: Miércoles 6 de Mayo de 2009, 17:42 »
0
A mi parecer tienes caracteres raros en el fichero. Abre el fichero de texto con un editor hexadecimal y dime qué te aparece.

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #11 en: Miércoles 6 de Mayo de 2009, 19:13 »
0
Hola m0skit0

Estuve revisando el archivo y no sale ningun caracter raro esto es lo que entrega el lector de hexa:

31 32 20 6c 75 69 20 32 33 2e 30 30 0d 0a 31 38
20 6b 69 6b 6f 20 39 38 2e 30 30 0d 0a 31 33 20
70 65 70 65 20 34 35 2e 30 30 0d 0a 31 31 20 6c
75 6c 75 20 36 37 2e 30 30 0d 0a 37 38 20 70 6f
6c 69 20 35 31 2e 30 30 0d 0a

Pienso que puede ser el retorno de la funcion fscanf() porq como devuelve un entero de pronto podria ser el problema ademas no estoy seguro, la otra es lo de hacer casting lo probe pero no funciona. Es q no se como la funcion fscanf() determina exactamente que es un entero, que es un string, o que es un float porque con la instruccion fscanf(cfptr,"%d%s%f",&cuenta,Nombre,&Balance) esta leyendo las tres cosas simultaneamente y no se el barrido que esta función le haga a la linea que estoy analizando.

Que me dices

Saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #12 en: Miércoles 6 de Mayo de 2009, 19:16 »
0
Vale, creo que ya lo tengo. Debes poner:

Código: C
  1. fscanf(cfptr,"%d %s %f",&cuenta,Nombre,&Balance)
  2.  
porque los tienes separados por espacios.

pablo_666

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problema con Archivos
« Respuesta #13 en: Miércoles 6 de Mayo de 2009, 20:51 »
0
Hola m0skit0

Enhorabuena gracias por tu ayuda, ya me funciono!! ahora si lee y escribe perfectamente los archivos, es mas sabes, le puse que sumara un valor float a ver si el dato realmente lo tomaba bien en flotante y si lo hace asi que ya Funciona!

Pues muchas gracias de nuevo y seguimos en contacto!

Saludos!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con Archivos
« Respuesta #14 en: Jueves 7 de Mayo de 2009, 10:02 »
0
De nada. Espero que sigas siendo asiduo al foro y ayudar a otra gente que lo necesite.  :beer: