Ficheros y estructuras

Iniciado por Cas980, 18 Abril 2014, 23:29 PM

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

Cas980

Saludos a toda la comunidad, tengo algunas dudas espero puedan auxiliarme con algunas.
Estoy trabajando en el siguiente codigo y me he topado con algunos problemas

En la parte de buscar por titulo a la hora de ingresar el titulo el programa se cierra, el problema sera con el fgets()? intente usar el gets() pero me pasaba lo mismo
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;

struct libros
{
   char id[30];
   char titulo[30];
   char autor[30];
   char editorial[30];
   int paginas;
}; libros registro [30];

int main()
{
int op,op2,i,j, cont=0,cant;
char temp[60];
char temp2[60],elim[60];
char *bus,*eli, *mos;
FILE *datalib;

       
        printf("\n Escoja su opcion: ");
        printf("\n 1 - Busqueda de registo de libro ");
        printf("\n 2 - Agregar nuevo registro de libro ");
        printf("\n 3 - Quitar registro de libro ");
        printf("\n 4 - Modificar registro de libro ");
        printf("\n 5 - Imprimir todos los registros ");
        printf("\n 0 - Salir");
        scanf("%d",&op);

       switch(op)
{
   case 0:
                   exit(0);
           break;
           case 1:
                   

printf("\n Escoja la opcion: ");
printf("\n 1 - Busqueda por ID: ");
printf("\n 2 - Busqueda por titulo: ");
printf("\n 0 - Salir: ");

scanf("%d",&op2);

datalib=fopen("libros.csv","r");
                           if(datalib==NULL){
                           printf("\n No se ha podido abrir el archivo");
                           exit(1);}
                           
switch (op2)
{
                   case 0:
                       exit(0);
                   case 1:
                           printf("\n Introduzca el ID del libro deseado:");
                           scanf("%s",&temp);
                           for(i=0;!feof(datalib);i++){
                               fgets(temp2,60,datalib);
                               bus=strtok(temp2,",");
                               if(strcmp(bus,temp)==0){
                                   printf("\n Registro encontrado");
                                   printf("\n Los datos son:");
                                   printf("\n\n");
                                   while(bus!=NULL){
                                       printf("\n  %s\n",bus);
                                       bus=strtok(NULL,",");}
                                   cont++;}
                           }
                           if(cont==0){
                               printf("\n ID no encontrada");}
                           system("PAUSE");

                       break;

                       case 2:
                           printf("\n Introduzca el titulo del libro deseado:");
                           fgets(temp,60,stdin);
                           for(i=0;!feof(datalib);i++){
                               fgets(temp2,60,datalib);
                               bus=strtok(temp2,",");
                               bus=strtok(NULL,",");
                               if(strcmp(bus,temp)==0){
                                   printf("\n Registro encontrado");
                                   printf("\n Los datos son:");
                                   printf("\n\n");

                                   while(bus!=NULL){
                                       printf("\n  %s\n",bus);
                                       bus=strtok(NULL,",");}
                                   cont++;}
                                   
                           }
                           if(cont==0){
                               printf("\n Titulo no encontrado");}
                               system("PAUSE");
                       break;

                       default:
                           printf("\nLa opcion no es correcta ");
                           printf("\n\n");
                           system("PAUSE");
                           system("cls");
break;
                       fclose(datalib);
                   }
           break;
system("PAUSE");
return 0;
}


El fichero tiene lo siguiente:

Citar

  DR453,INGENIERIA INDUSTRIAL,PHILIP HICKS,PATRIA,450
  RT567,TRASMISION DE DATOS Y REDES,FOROUZAN,MC GRAW HILL,920
  TJ567,REDES DE COMPUTADORAS,ANDREW TANENBAUM,PEARSON,870


ivancea96

Antes del "system("pause");" del final, tienes un "break;". Qué hace ese break?

d91

para empezar ya no tienes que hacer un arreglo de la estructura libros, porque estas usando ficheros, tus menus no funcionan porque no estan dentro de ciclos, y lo mas importante no puedes hacer un fichero manualmente, escribir en el y despues tratar de leerlo con el formato de tu estructura, sino que guardar cada cosa en otra variable de lectura de archivo directo y enviarlo a tu estructura y ademas deberias de modularizar tus case para no perderte,
Si quieres leer un fichero con el formato de tu estructura debes guardar datos con tu estructura, te reestructure el codigo solo para leer:
Código (cpp) [Seleccionar]

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


struct{
    char id[30];
    char titulo[30];
    char autor[30];
    char editorial[30];
    int paginas;
}libros;
/******************funcion de busqueda************/
void busqueda(){
FILE *datalib;
int op2;
char temp[60];
bool salir=false;
   do{
   system("cls");
printf("\n Escoja la opcion: ");
   printf("\n 1 - Busqueda por ID: ");
printf("\n 2 - Busqueda por titulo: ");
   printf("\n 0 - Salir: ");
scanf("\n%d",&op2);
   switch(op2){
     case 1: {
     system("cls");
     if((datalib=fopen("C:\\libros.csv","r"))==NULL)
      {
        printf("Error al abrir el archivo!!\n");
         system("pause");
              }//if de comprobacion
         else{
          printf("Introduzca el ID del libro: ");scanf("%[^\n]",temp);
            while(fread(&libros,sizeof(libros),1,datalib)==1) {
                 if(strcmp(libros.id,temp)==0)
                 {
                 printf("\nID %s",libros.id);
                 printf("\nTitulo %s",libros.titulo);
                 printf("\nAutor %s",libros.autor);
                 printf("\nEditorial %s",libros.editorial);
                 printf("\nPaginas %d",&libros.paginas);
                 }//del if comparador
                 else{
                 printf("\nRegistro No encontrado\n");
                 system("pause");
                 }//else de no encontrado
            }//del while
         } //del else
      fclose(datalib);
     }//del case 1
     break;
     case 2:{
system("cls");
      if((datalib=fopen("C:\\libros.csv","r"))==NULL)
            {
            printf("Error al abrir el archivo!!\n");
            system("pause");
            }//del if de comprobacion
            else{
                printf("Introduzca el titulo: ");scanf("%[^\n]",temp);
                while(fread(&libros,sizeof(libros),1,datalib)==1){
                    if(strcmp(libros.titulo,temp)==0){
                 printf("\nID %s",libros.id);
                 printf("\nTitulo %s",libros.titulo);
                 printf("\nAutor %s",libros.autor);
                 printf("\nEditorial %s",libros.editorial);
                 printf("\nPaginas %d",&libros.paginas);
                    }//del if de encontrado
                    else{
                    printf("\nRegistro No encontrado\n");
                 system("pause");
                    }//del else de no encontrado
                }//del while
            }//del else
            fclose(datalib);
     }//del case 2
     break;
     case 0: salir=true;
     break;
   }
   }while(salir!=true);

}
/***************procedimiento principal***********************/
int main()
{ //del main
int op,op2,i,j, cont=0,cant,salir=false;
char temp[60];
char temp2[60],elim[60];
char *bus,*eli, *mos;
FILE *datalib;
         do{
          system("cls");
         printf("\n Escoja su opcion: ");
         printf("\n 1 - Busqueda de registro de libro ");
         printf("\n 2 - Agregar nuevo registro de libro ");
         printf("\n 3 - Quitar registro de libro ");
         printf("\n 4 - Modificar registro de libro ");
         printf("\n 5 - Imprimir todos los registros ");
         printf("\n 0 - Salir");
         scanf("\n%d",&op);

        switch(op)
{ //del switch
            case 1:
               busqueda();//llama a la funcion de busqueda
               break;
            case 2:
            system("cls");
            printf("en construccion");
               system("pause");
               break;
            case 3:
            system("cls");
               printf("en construccion");
               system("pause");
               break;
            case 4:
            system("cls");
            printf("en construccion");
               system("pause");
               break;
            case 5:
            system("cls");
            printf("en construccion");
            system("pause");
               break;
            case 0: salir=true;
            break;
            }
            }while(salir!=true);
      }//del main

para guardar, ingresar tus datos a la estructura y despues

Código (cpp) [Seleccionar]

FILE *datalib=fopen("C:\\libros.csv","a+");
fwrite(&libros,sizeof(libros),1,datalib);

d91

solo te reestructure el codigo pero no me habia dado cuenta que la extension .csv de tu fichero es una extension de excel, por lo tanto no creo te vaya a fucionar mejor usa un .txt o .dat que son texto plano, si quieres usar el .csv es harina de otro costal, es algo que esta fuera del alcance de lo basico de c, porque adentro de excel podemos habilitar la opcion programador donde podemos hacer conexiones por medio de las librerias, un caso muy usado es la conexion de un formulario de visual basic hacia access o hacia excel