Ayuda - Búsqueda - Miembros - Calendario
Versión Completa: Ayuda con imprimir un archivo por pantalla en c++
::ChileWarez.org - Compartir No tiene Limites! > Rincón Técnico > Programación (NO Soporte PC)
fabiz
resulta que cuando le coloco mostrar, para que me imprima el contenido del archivo por pantalla, me imprime dos veces el contenido del archivo.

El Switch lo uso porque despues voy a usar mas opciones.

CÓDIGO

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void libro(void);
void mostrar(void);

struct uno
{
  char nom_autor[20];
  char titulo[20];
  char cod[3];
  char cant[3];
}ingresa;

//------------------------------------------------------------------------------

void main()
{
int opcion,respuesta=1;
while(respuesta==1)
{
printf("    ------------------\n");
printf("    | BIBLIOTEK v1.0 |\n");
printf("    ------------------\n\n\n\n");
printf("\tOPCIONES\n");
printf("\t--------\n");
printf("\n 1 Ingresar Libros");
printf("\n 2 Mostrar Listados");
printf("\n 3 Salir");
printf("\n\n\n Ingrese una Opcion: ");
scanf("%d",&opcion);
clrscr();
switch(opcion)
{
case 1:libro();
break;
case 2:mostrar();
break;
case 3:exit(0);
break;
default:printf("INGRESE UNA OPCION VALIDA");
}
printf("\n\n\n\n Desea Realizar Otra Operacion (Si=1  -  No=2): ");
scanf("%d",&respuesta);
clrscr();
}
}

//------------------------------------------------------------------------------

void libro()
{
int i;
FILE *libro;
libro=fopen("c:\\libros.txt","a+b");
for(i=1;i<=1;i++)
{
printf("\tINGRESAR LIBRO");
printf("\n\t--------------\n\n");
printf("\n Ingrese Nombre del Autor      : ");
scanf("%s",&ingresa.nom_autor);
printf("\n Ingrese Titulo del Libro      : ");
scanf("%s",&ingresa.titulo);
printf("\n Ingrese Codigo del Libro      : ");
scanf("%s",&ingresa.cod);
printf("\n Ingrese Cantidad en Existencia: ");
scanf("%s",&ingresa.cant);
fwrite(&ingresa,sizeof(ingresa),1,libro);
}
fclose(libro);
}

//------------------------------------------------------------------------------

void mostrar()
{
int opcion;
FILE *libro;
libro=fopen("c:\\libros.txt","r");
printf("\tMOSTRAR LISTADO\n");
printf("\t---------------\n");
printf("\n 1 Listado de Libros");
printf("\n\n\n Ingrese una Opcion: ");
scanf("%d",&opcion);
clrscr();
switch(opcion)
{
case 1:printf("\tLISTADO DE LIBROS\n");
printf("\t-----------------\n\n");
printf("\n AUTOR\t TITULO\t CODIGO\t CANTIDAD\n");
printf(" -------------------------------\n");
while(!feof(libro))
{
fread(&ingresa,sizeof(ingresa),1,libro);
printf(" %s\t %s\t  %s\t  %s\n",ingresa.nom_autor,ingresa.titulo,ingresa.cod,ingresa.cant);
}
}
}
//------------------------------------------------------------------------------
Soujiro_Elric
Pregunta, ¿no deberías colocar, en fread y fwrite, sizeof(struct uno)? ¿O da igual?

Lo otro, ¿te imprime dos veces la variable, o te imprime hasta el final e imprime de nuevo?
fabiz
imprime hasta el final y la vuelve a imprimir

Onda si escribo Flores.... cuando le coloko imprimir me sale:

Flores
Flores
Soujiro_Elric
Ah, ya lo detecté.

CÓDIGO

switch(opcion)
{
   case 1:
       printf("\tLISTADO DE LIBROS\n");
       printf("\t-----------------\n\n");
       printf("\n AUTOR\t TITULO\t CODIGO\t CANTIDAD\n");
       printf(" -------------------------------\n");
       while(!feof(libro))
       {
          fread(&ingresa,sizeof(ingresa),1,libro);
          printf(" %s\t %s\t  %s\t  %s\n", ingresa.nom_autor, ingresa.titulo, ingresa.cod, ingresa.cant);
       }
}


Tú tienes esto (por cierto, SIEMPRE ORDENA TU CÓDIGO ASÍ, porque así se entiende más para tí y más para los demás, oka?), pero te falto algo esencial:

CÓDIGO

switch(opcion)
{
   case 1:
       printf("\tLISTADO DE LIBROS\n");
       printf("\t-----------------\n\n");
       printf("\n AUTOR\t TITULO\t CODIGO\t CANTIDAD\n");
       printf(" -------------------------------\n");
       while(!feof(libro))
       {
          fread(&ingresa,sizeof(ingresa),1,libro);
          printf(" %s\t %s\t  %s\t  %s\n", ingresa.nom_autor, ingresa.titulo, ingresa.cod, ingresa.cant);
       }
       break; //Se te olvidó esto
}


Despues de cada case va un break.


Espero que te funcione ;D
fabiz
no funciona, sigue repitiendo las variables.... gracias de todas formas...

PD: ni el profe cacho porke pasaba eso.....XD
xot
este while :

while(!feof(libro))
{
fread(&ingresa,sizeof(ingresa),1,libro);
printf(" %s\t %s\t %s\t %s\n", ingresa.nom_autor, ingresa.titulo, ingresa.cod, ingresa.cant);
}


dejalo de esta forma:

fread(&ingresa,sizeof(ingresa),1,libro);
while(!feof(libro))
{

printf(" %s\t %s\t %s\t %s\n",ingresa.nom_autor,ingresa.titulo,ingresa.cod,ingresa.cant);
fread(&ingresa,sizeof(ingresa),1,libro);
}

ahi no tienes problema con leer el termino con feof , me parece , prueba ^^ saludos

y como dijeron , ke nos e te olvide el break si le agregay mas cosas XD
fabiz
ahi funciona, no repite las variables, pero solo me muestra dos variables... osea dos autores, dos titulos, dos codigos y dos cantidad???
xot
no entendi xd

lo prove y funciona en todo caso =)
fabiz
si funciona pero solo si ingresay por ejemplo 4 autores, 4 titulos, etc.... solo te imprime 2
xot
=o ami me imprime todos .. ke raro x)

... te falta un fclose cuando terminas de mostrar . kisas eso te dio problema cuando despues abriste el archivo para escribir y ya estaba abierto de mostrar .

fabiz
Gracias, sirvio.... la otra duda ke tengo, es ke cuando comparo los titulos de los libros con "strcmp" para hacer una reserva... aunke ingrese cualkier palabra me dice ke existe. porque pasa eso???

CÓDIGO

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

void libro(void);
void mostrar(void);
void prestar(void);

struct uno
{
  char nom_autor[20];
  char titulo[20];
  char cod[3];
  char cant[3];
}ingresa;


//---------------------------------------------------------------------

void main()
{
int opcion,respuesta=1;
//textcolor(6);
//textbackground(8);
while(respuesta==1)
{
printf("    ------------------\n");
printf("    | BIBLIOTEK v1.0 |\n");
printf("    ------------------\n\n\n\n");
printf("\tOPCIONES\n");
printf("\t--------\n");
printf("\n 1 Ingresar Libros");
printf("\n 2 Mostrar Listados");
printf("\n 3 Ingresar Prestamo de libro");
printf("\n 5 Salir");
printf("\n\n\n Ingrese una Opcion: ");
scanf("%d",&opcion);
clrscr();
switch(opcion)
{
case 1:libro();
break;
case 2:mostrar();
break;
case 3:prestar();
break;
case 5:exit(0);
break;
default:printf("INGRESE UNA OPCION VALIDA");
}
printf("\n\n\n\n Desea Realizar Otra Operacion (Si=1  -  No=2): ");
scanf("%d",&respuesta);
clrscr();
}
}

//---------------------------------------------------------------------

void libro()
{
int i;
FILE *libro;
libro=fopen("c:\\libros.txt","a+b");
for(i=1;i<=1;i++)
{
printf("\tINGRESAR LIBRO");
printf("\n\t--------------\n\n");
printf("\n Ingrese Nombre del Autor      : ");
scanf("%s",&ingresa.nom_autor);
printf("\n Ingrese Titulo del Libro      : ");
scanf("%s",&ingresa.titulo);
printf("\n Ingrese Codigo del Libro      : ");
scanf("%s",&ingresa.cod);
printf("\n Ingrese Cantidad en Existencia: ");
scanf("%s",&ingresa.cant);
fwrite(&ingresa,sizeof(ingresa),1,libro);
}
fclose(libro);
}

//----------------------------------------------------------------------

void mostrar()
{
char titup[20],fecha[10],rut[13],nom[20];
int opcion;
FILE *libro;
FILE *reserva;
FILE *devolver;
libro=fopen("c:\\libros.txt","r");
reserva=fopen("c:\\reserva.txt","r");
printf("\tMOSTRAR LISTADO\n");
printf("\t---------------\n");
printf("\n 1 Listado de Libros");
printf("\n 2 Listado de Reservas");
printf("\n\n\n Ingrese una Opcion: ");
scanf("%d",&opcion);
clrscr();
switch(opcion)
{
case 1:printf("\tLISTADO DE LIBROS\n");
printf("\t-----------------\n\n");
printf("\n AUTOR\t TITULO\t CODIGO\t CANTIDAD\n");
printf(" -------------------------------\n");
fread(&ingresa,sizeof(ingresa),1,libro);
while(!feof(libro))
{
printf(" %s\t %s\t  %s\t  %s\n",ingresa.nom_autor,ingresa.titulo,ingresa.cod,ingresa.cant);
fread(&ingresa,sizeof(ingresa),1,libro);
}
break;
case 2:printf("\tLISTADO DE RESERVAS\n");
printf("\t-------------------\n\n");
printf("\n TITULO   FECHA       RUT         NOMBRE\n");
printf(" --------------------------------------\n");
while(!feof(reserva))
{
fscanf(reserva,"%s %s %s %s\n",&titup,&fecha,&rut,&nom);
printf("  %s   %s   %s   %s",titup,fecha,rut,nom);
}
break;
default:printf("ESCRIBA OPCION VALIDA");
}
}

//-----------------------------------------------------------------------

void prestar()
{
FILE *libro;
FILE *reserva;
char titulo[20];
char fecha[11];
char rut[13];
char titup[5];
char nom[20];
libro=fopen("c:\\libros.txt","r");
reserva=fopen("c:\\reserva.txt","a+b");
printf("\tPRESTAMO DE LIBRO");
printf("\n\t-----------------\n\n");
printf("\n\n Ingrese el Titulo del Libro a Prestar: ");
scanf("%s",&titup);
fscanf(libro,"%s %s %s %s\n",&ingresa.nom_autor,&ingresa.titulo,&ingresa.cod,&ingresa.cant);
if(strcmp(titup,titulo))
{
printf("\n\n EXISTEN LIBROS\n\n");
printf("\n Ingrese Fecha : ");
scanf("%s",&fecha);
printf("\n Ingrese RUT   : ");
scanf("%s",&rut);
printf("\n Ingrese Nombre: ");
scanf("%s",&nom);
fprintf(reserva," %s %s %s %s\n",titup,fecha,rut,nom);
printf("\n\n\n ENTREGADO");
}
else
{
printf("\n\n NO EXISTE EL LIBRO");
}
fclose(libro);
fclose(reserva);
}

//---------------------------------------------------------------------------
xot

if(strcmp(titup,titulo))
ekivalente a if(strcmp(titup,titulo)!=0) , si las cadenas que comparas son iguales devuelve 0 , asi ke lo estas haciendo al reves



if(strcmp(titup,titulo)==0) <- ahi si .. o if(!strcmp(titup,titulo))

smile.gif
fabiz
sigue igual....
xot
fijate lo que estas comparando
estas comparando titup con titulo , y a titulo no le as pasado ni 1 valor el ke si escaneaste fue ingresa.titulo
fabiz
si lo hago con ingresa.titulo pero sigue igual

if(strcmp(titup,ingresa.titulo)==0)
xot
lo probe y funciona bien el if , pero fijate ke estas comparando solo con la primera linea del archivo deverias compararlo con todos
Esta es una versión "reducida (lo-fi)" de nuestro contenido. Para ver la versión completa con mas información, formato e imágenes, por favor haz click aquí.