C/Visual C - mostrar datos de un fichero

 
Vista:
sin imagen de perfil

mostrar datos de un fichero

Publicado por Natalia (7 intervenciones) el 08/10/2014 17:44:35
Buenas tardes, tengo dos problemas con este programa.
es una estructura que permite el ingreso de distintos datos le puse como un bucle for que permita maximo que se ingrese hasta 3 veces, salvo que el año sea igual a 1000 y finalice. cuando lo cargo me permite ingresarlo 3 veces por pantalla, pero en el archivo se guarda solo el primero ingresado por teclado.
Luego una vez resuelto esto, tengo que preguntar al usuario que ingrese que numero de isbn desea mostrar por pantalla. y no entiendo como resolverlo. soy muy nueva en programacion, si alguien me pudiese ayudar, lo agredeceria mucho. ya que me esta trabando para poder avanzar con este trabajo que es bastante largo.

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

typedef struct libro
{
int isbn;
char titulo[20];
char autor[20];
int anio;
char editorial[20];
};

int main()
{
struct libro milibro[3];
FILE *archivo;
int i;
archivo=fopen("archivolibro.txt","w");
if (archivo==NULL)
{
printf("No se pudo abrir el archivo.\n");
fclose(archivo);
}
else

for (i=0;i<3;i++)
{
puts("Ingrese ISBN:");
scanf("%d",&milibro[i].isbn);
getchar();
fprintf(archivo,"ISBN: %d\n",milibro[i].isbn);
puts("Ingrese Titulo:");
gets(milibro[i].titulo);
fprintf(archivo,"TITULO: %s\n",milibro[i].titulo);
puts("Ingrese Autor:");
gets(milibro[i].autor);
fprintf(archivo,"AUTOR: %s\n",milibro[i].autor);
puts("Ingrese Anio:");
scanf("%d",&milibro[i].anio);
getchar();
if (milibro[i].anio==1000)
{

fprintf(archivo,"ANIO: %d\n",milibro[i].anio);
puts("Carga finalizada\n");
exit(1);
}
else

{
puts("Ingrese Editorial:");
gets(milibro[i].editorial);
fprintf(archivo,"EDITORIAL: %s\n",milibro[i].editorial);
fclose(archivo);
}

}
/*aca no se si esta bien y no sesi luego si tengo que usar un feof para recorrer el archivo, lo intente hacer pero no salta error*/
printf("Ingrese el numero de ISBN que desea mostrar:\n");
fscanf(archivo,"%d",milibro[i].isbn);

archivo=fopen("archivolibro.txt","r");
if (archivo=NULL)
{
printf("Error al abrir el archivo\n");
fclose(archivo);

}
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

mostrar datos de un fichero

Publicado por Capitan Kirk (97 intervenciones) el 09/10/2014 08:24:01
En el archivo se guarda solamente el primero ingresado por teclado porque estás cerrando el archivo dentro del bucle for (tienes un fclose() en la cláusula else, al final del bucle). Además, no cierras el archivo cuando milibro.anio es igual a 1000 (que es tu condición para finalizar la entrada de datos).

El segundo problema se debe a que estás leyendo el ISBN de un archivo que, en teoría, no está abierto. Primero tienes que abrir el archivo para lectura (lo has hecho, pero después del fscanf). Luego, lees el ISBN del archivo y comprueba si es la marca de final de fichero. El proceso sería (te lo pongo en pseudocódigo, el pasarlo a programa es tarea tuya):

1
2
3
4
5
6
7
8
9
10
Abre en modo lectura
Mientras no sea fin de fichero
    Leer ISBN
    Si es fin de fichero
        Salir de bucle
    Lee resto de la estructura
        Si ISBN == ISBN pedido
            Mostrar datos
            Salir del bucle
Fin del bucle

La comprobación de fin de fichero dentro del bucle es porque, cuando lees el último registro, aún no has leído el final de fichero. El final de fichero lo encuentra cuando intentas leer después del último registro.

Un par de cositas más:

El uso de typedef es para dar un nuevo nombre a un tipo. En el caso de estructuras, sería:

typedef struct
{
...
}
Libro;

De esta forma, Libro es un nombre de tipo que puedes utilizar en tu programa, de este modo:

Libro milibro;

en lugar de

struct Libro milibro;

Otra cuestión es que estás saliendo del bucle de entrada de datos con exit(). La función exit() es para forzar la salida del programa. Para forzar la salida del bucle deberías utilizar break.

Bueno, esto de momento. Si tienes más dudas, ya sabes dónde estamos.

Saludos,
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