Problema al leer registros en ficheros

Iniciado por neveldine, 25 Noviembre 2015, 13:35 PM

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

neveldine

Hola,
Tengo un problema con este programa. Como podéis ver cuando muestro los registros del fichero los duplica.


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

#include "MemoryManager.h"

#define N 80
#define SALIR 4

typedef struct {
char nombre[N];
char direccion[N];
int telefono;
} t_persona;


int tolower(int);
int menu(void);
void crearFichero(FILE **pf);
void introducirRegistros(FILE *pf);
void visualizarFichero(FILE *pf);

/**
* Punto de entrada y salida al programa principal
*/
int main()
{
int op = 0;
FILE *pf = NULL;

do {
op = menu();

switch (op)
{
case 1: // crear fichero
crearFichero(&pf);
break;

case 2: // introducir registros
introducirRegistros(pf);
break;

case 3: // visualizar registros
visualizarFichero(pf);
break;

case 4: // salir
printf("bye bye\n");
break;
}
} while (op != SALIR);

fclose(pf);
MemoryManager_DumpMemoryLeaks();
return 0;
}

int tolower(int c)
{
const int dsp = 'a' - 'A';

if (c >= 'A' && c <= 'Z')
return c + dsp;
return c;
}

int menu(void)
{
int op = 0;
char linea[N] = { 0 };

do {
printf("\n");
printf("1. Crear fichero\n");
printf("2. Introducir registros\n");
printf("3. visualizar registros\n");
printf("4. salir\n");

printf("\topcion: ");
fgets(linea, N, stdin);
sscanf(linea, "%d", &op);
} while (op < 1 || op > 4);

return op;
}

void crearFichero(FILE **pf)
{
char nomFichero[N] = { 0 };
char resp = 0;
char linea[N] = { 0 };

printf("Nombre del fichero: ");
fgets(nomFichero, N, stdin);
nomFichero[strlen(nomFichero) - 1] = 0;

if (*pf != NULL) {

// existe, preguntar si se sobreesribe
do {
printf("Desea sobreescribir el fichero");
fgets(linea, N, stdin);
sscanf(linea, "%c", &resp);
} while (tolower(resp) != 's'
&& tolower(resp) != 'n');

if (tolower(resp) == 'n')
return;
}

*pf = fopen(nomFichero, "w+b");
}

void introducirRegistros(FILE *pf)
{
char resp = 0;
char linea[N] = { 0 };

t_persona *p_per = malloc(sizeof(t_persona));
memset(p_per, 0, sizeof(t_persona));
if (p_per == NULL)
{
printf("memoria insuficiente");
exit(-1);
}


do {
printf("\n------\n");
printf("Nombre: ");
fgets(p_per->nombre, N, stdin);
p_per->nombre[strlen(p_per->nombre) - 1] = 0;

printf("Direccion: ");
fgets(p_per->direccion, N, stdin);
p_per->direccion[strlen(p_per->direccion) - 1] = 0;

printf("Telefono: ");
fgets(linea, N, stdin);
sscanf(linea, "%d", &p_per->telefono);

rewind(pf);
fwrite(p_per, sizeof(t_persona), 1, pf);

do {
printf("\nDesea introducir otro registro: ");
fgets(linea, N, stdin);
sscanf(linea, "%c", &resp);
} while (tolower(resp) != 's'
&& tolower(resp) != 'n');
} while (tolower(resp) == 's');

free(p_per);
}

void visualizarFichero(FILE *pf)
{
char linea[N] = { 0 };
int pos = 0;

t_persona *p_per = malloc(sizeof(t_persona));
if (p_per == NULL)
{
printf("memoria insuficiente");
exit(-1);
}

rewind(pf);

while (!feof(pf) && !ferror(pf)) {
fread(p_per, sizeof(t_persona), 1, pf);
printf("%s\n", p_per->nombre);
printf("%s\n", p_per->direccion);
printf("%d\n", p_per->telefono);
}

free(p_per);
}




1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 1
Nombre del fichero: red.datos

1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 2

------
Nombre: Marina
Direccion: vereda
Telefono: 234
Desea introducir otro registro: n

1. Crear fichero
2. Introducir registros
3. visualizar registros
4. salir
        opcion: 3

Marina
vereda
234
Marina
vereda
234


Gracias anticipadas.

Un cordial saludo

neveldine

Ya está solucionado, el problema era que al visualizar los registros el bucle tiene que ser:


fread(p_per, sizeof(t_persona), 1, pf);
while (!feof(pf) && !ferror(pf)) {
printf("%s\n", p_per->nombre);
printf("%s\n", p_per->direccion);
printf("%d\n", p_per->telefono);
fread(p_per, sizeof(t_persona), 1, pf);
}