C/Visual C - Problema con archivos y feof

 
Vista:
Imágen de perfil de Nani

Problema con archivos y feof

Publicado por Nani (3 intervenciones) el 21/10/2015 08:50:54
Buenas, a ver si alguien puede ayudarme... me pasa lo siguiente...
Cree dos programas con archivos. El primero pide ingresar DNI y teléfono (ambas variables enteras). Lo hace perfecto, me permite más de un ingreso, si cierro y abro el programa me agrega al final del archivo el nuevo ingreso, me permite la busqueda.... si pongo un dni repetido me avisa (osea q la hace bien).
Ahora, arme otro programa que pide ingresar DNI y nombre (entero y cadena). Ingreso el primero perfecto (lo graba bien en el archivo), pero al momento de hacer un nuevo ingreso no me deja. Si yo agrego a mano en el txt un DNI y nombre, cuando realizo la busqueda no reconoce la 2º linea escrita (el q agregue). No esta recorriendo el archivo cuando agrego una cadena.
Dejo los dos programas, capaz a alguien tb le paso y puede ayudarme, porque esto me traba el resto q puedo hacer u.u

Saludos.

Programa DNI y teléfono:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdlib.h>
#include <stdio.h>
 
struct arch{
    int tel;
    int dni;
}AR;
 
int main()
{
    int sen=1, xdni=0, opc1=0, opc2=0, xtel=0;
    FILE*fi=fopen("ficha001.txt", "a+");
    if(fi==NULL)
    {
        printf("Archivo inexistente!\n");
        fi=fopen("ficha001.txt", "a+");
        system("pause");
        system("cls");
    }
    while(sen=1)
    {
        printf("Ingrese dni: ");
        scanf("%d", &xdni);
        while(!feof(fi))
        {
            fscanf(fi, "%d", &AR.dni);
            if(AR.dni!=xdni)
            {
                if(feof(fi))
                {
                    printf("Ingrese telefono: ");
                    scanf("%d", &xtel);
                }
            }
            else
            {
                printf("DNI ya existente!\n");
                system("pause");
                system("cls");
                printf("Ingrese otro dni: ");
                xdni=0;
                scanf("%d", &xdni);
                rewind(fi);
            }
        }
        printf("Desea confirmar el alta? 1. Si   2. No: ");
        scanf("%d", &opc1);
        if(opc1==1)
        {
            AR.dni=xdni;
            AR.tel=xtel;
            fprintf(fi, "%-9d %-10d\r\n", AR.dni, AR.tel);
            system("pause");
        }
        if(opc1==2)
        {
            printf("Gracias por utilizar nuestro servicio!\n");
            system("pause");
        }
        printf("Desea realizar otra alta? 1. Si   2. No: ");
        scanf("%d", &opc2);
        if(opc2==1)
        {
            system("cls");
            rewind(fi);
            sen=1;
        }
        if(opc2==2)
        {
            fclose(fi);
            sen=0;
            return 0;
        }
    }
    return 0;
}

Programa DNI y nombre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdlib.h>
#include <stdio.h>
 
struct arch{
    char nom[15];
    int dni;
}AR;
 
int main()
{
    int sen=1, xdni=0, opc1=0, opc2=0;
    char xnom[15];
    FILE*fi=fopen("ficha003.txt", "a+");
    if(fi==NULL)
    {
        printf("Archivo inexistente!\n");
        fi=fopen("ficha003.txt", "a+");
        system("pause");
        system("cls");
    }
    while(sen=1)
    {
        printf("Ingrese dni: ");
        scanf("%d", &xdni);
        while(!feof(fi))
        {
            fscanf(fi, "%d", &AR.dni);
            if(AR.dni!=xdni)
            {
                if(feof(fi))
                {
                    printf("Ingrese nombre: ");
                    fflush(stdin);
                    gets(xnom);
                }
            }
            else
            {
                printf("DNI ya existente!\n");
                system("pause");
                system("cls");
                printf("Ingrese otro dni: ");
                xdni=0;
                scanf("%d", &xdni);
                rewind(fi);
            }
        }
        printf("Desea confirmar el alta? 1. Si   2. No: ");
        scanf("%d", &opc1);
        if(opc1==1)
        {
            AR.dni=xdni;
            strcpy(AR.nom, xnom);
            fprintf(fi, "%-9d %-16s\r\n", AR.dni, AR.nom);
            system("pause");
        }
        if(opc1==2)
        {
            printf("Gracias por utilizar nuestro servicio!\n");
            system("pause");
        }
        printf("Desea realizar otra alta? 1. Si   2. No: ");
        scanf("%d", &opc2);
        if(opc2==1)
        {
            system("cls");
            rewind(fi);
            sen=1;
        }
        if(opc2==2)
        {
            fclose(fi);
            sen=0;
            return 0;
        }
    }
    return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problema con archivos y feof

Publicado por aguml (272 intervenciones) el 21/10/2015 09:40:19
Tu problema es que usas fscanf en un bucle para leer un entero tras otro que es el dni pero eso no es asi. Tienes que usar fread para leer una estructura completa y luego en la estructura lees el dni obtenido. El problema es que un entero normalmente usa 4 bytes y vas leyendo de 4 en 4 pero claro, tu cadena que irá detrás del dni tiene 15 bytes así que la segunda vez que intentas leer un dni realmente estas leyendo los 4 primeros bytes de la cadena y acaba descuadrado se todo. Si no quieres usar fread puedes usar otro fscanf para leer la cadena justo después o usar fseek y ftell para desplazarte al siguiente dni pero lo ideal es usar fread.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema con archivos y feof

Publicado por Tom (619 intervenciones) el 21/10/2015 12:32:02
No sé si la lógica de tu programa está del todo bien, pero lo que puedes hacer es esto:

1
2
3
4
5
6
7
printf("Ingrese dni: ");
 
        scanf("%d", &xdni);
 
        while(!feof(fi))
        {
            fscanf(fi, "%d %s", &AR.dni, &AR.nom);
O sea, trata de leer lo mismo que has escrito.

Por lo demás, deberías intentar no usar gets()

1
2
                    //gets(xnom);
                    fgets(xnom, 15, stdin);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problema con archivos y feof

Publicado por aguml (272 intervenciones) el 21/10/2015 15:43:17
Lo ideal es que se acostumbre a leer con fread y la estructura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema con archivos y feof

Publicado por Tom (619 intervenciones) el 21/10/2015 18:46:00
Sí, en general será mejor usar fread() y datos estructurados. Mi recomendación era para el código que ya tiene.

De todos modos, de ninguna de las dos formas es fácil manejar cadenas de longitud variable, y si las cadenas son de longitud fija (como en este caso) con fscanf() te puede funcionar bastante bien (en lugar de usar %s se podría usar %15c o algo parecido, que alguien me corrija si no se puede porque lo digo de memoria ...) si el string es susceptible de contener espacios en blanco, que harían "fallar" al %s.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nani

Problema con archivos y feof

Publicado por Nani (3 intervenciones) el 21/10/2015 18:48:44
Muchas gracias a los dos. Voy a probar con ambas cosas, ya que tengo que hacer otro prog y cargar variables onda padrón, así que son muchas mas que dos. Anoche probé usar el fread/fwrite y logre que escriba en el archivo pero llena mal los enteros, me aparecen como símbolos y no hace el salto de linea. Voy a tratar de sacarlo y sino repregunto a ver si pueden seguir ayudándome :P

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con archivos y feof

Publicado por Tom (619 intervenciones) el 22/10/2015 09:28:53
A ver ... en tu caso usas printf para escribir los datos numéricos en el fichero, con lo cual el dni (por ejemplo) lo estás escribiendo como texto. Al usar scanf() para leer, estás haciendo el proceso contrario, convertir de texto a "binario".

Por eso, la combinación printf()/scanf() se suele usar en estos casos, ya que te ahorras algún proceso.

Cuando usas write y read probablemente estás escribiendo el valor numérico tal cual, o sea "en binario", el fichero de texto es "ilegible".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nani

Problema con archivos y feof

Publicado por Nani (3 intervenciones) el 22/10/2015 21:27:10
Sep, precisamente las variables enteras quedan como codificadas si abro el archivo txt, y las variables char están legibles. Igual cuando consulto los datos por pantalla, los imprime bien como son.
Ya hice el archivo binario (total a simple vista no va a poder leerse) y use fread y fwrite. Ya tengo los módulos alta, baja, modificación y consulta hechos (Osea q puedo llenar el padrón). Ahora me faltaría realizar el alta de mesas, listas, simular votación y escrutinio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar