2010-05-16 7 views
0
problèmes

Ok j'ai problème avec mon code pour lire le fichier binaire ...fichiers binaires d'écriture/lecture

d'abord, je vais vous montrer mon code d'écriture:

void book_saving(char *file_name, struct BOOK *current) 
{ 
    FILE *out; 
    BOOK buf; 

    out = fopen(file_name, "wb"); 

    if(out != NULL) 
    { 
     printf_s("Writting to file..."); 
     do 
     { 
      if(current != NULL) 
      { 
       strcpy(buf.catalog_number, current->catalog_number); 
       strcpy(buf.author, current->author); 
       buf.price = current->price; 
       strcpy(buf.publisher, current->publisher); 
       strcpy(buf.title, current->title); 
       buf.price = current->year_published; 
       fwrite(&buf, sizeof(BOOK), 1, out); 
      } 
      current = current->next; 
     } while(current != NULL); 

     printf_s("Done!\n"); 
     fclose(out); 
    } 
} 

et voici ma « version » pour la lecture:

int book_open(struct BOOK *current, char *file_name) 
{ 
    FILE *in; 
    BOOK buf; 
    BOOK *vnext; 
    int count; 
    int i; 

    in = fopen("west", "rb"); 
    printf_s("Reading database from %s...", file_name); 
    if(!in) 
    { 
     printf_s("\nERROR!"); 
     return 1; 
    } 

    i = fread(&buf,sizeof(BOOK), 1, in); 
    while(!feof(in)) 
    { 
     if(current != NULL) 
     { 
      current = malloc(sizeof(BOOK)); 
      current->next = NULL; 
     } 

     strcpy(current->catalog_number, buf.catalog_number); 
     strcpy(current->title, buf.title); 
     strcpy(current->publisher, buf.publisher); 
     current->price = buf.price; 
     current->year_published = buf.year_published; 
     fread(&buf, 1, sizeof(BOOK), in); 

     while(current->next != NULL) 
      current = current->next; 

     fclose(in); 

    } 
    printf_s("Done!"); 

    return 0; 
} 

J'ai juste besoin d'enregistrer ma liste chaînée dans le fichier binaire et de pouvoir relire ... s'il vous plaît aidez-moi. Le programme juste ne lisent pas ou son accident chaque fois que la situation est différente ...

+1

Montrez-nous la définition de struct BOOK. –

+0

J'ai supposé que 'BOOK' avait' char [] 'déclaré au lieu de' char * '... – Phil

Répondre

2
  1. Votre boucle do..while pourrait être formé mieux. Si vous allez vérifier à la fin, ne vérifiez pas au début aussi. Si vous trouvez que vous devez faire cela, vous n'utilisez probablement pas le bon contrôle de flux. Par exemple, ici vous devriez juste dire while(current != NULL) { }

  2. Qu'essayez-vous de faire avec if(current != NULL) { }? Vous définissez le nœud actuel dans votre boucle à un nouveau BOOK, et en faisant son prochain élément NULL. Pourquoi? Pourquoi ne pas simplement refléter la boucle que vous avez dans la méthode d'écriture? Regardez ce que vous faites si current == NULL implicitement - vous êtes strcpy ing dans votre méthode de lecture. Ne fais pas ça.

  3. Vous semblez dire fclose(in) dans la boucle while dans book_open.

J'obtiendrai plus quand je le compilerai.


Ok, j'ai modifié le code quelque peu faire 2 hypothèses

  1. Ce n'est pas un problème de devoirs
  2. BOOK a seulement 1 pointeur (next) et tout le reste est un tableau avec la mémoire allouée à elle

book_saving - boucles simplement et écrit

FILE *out; 
BOOK buf; 

out = fopen(file_name, "wb"); 
if(out == NULL) return; 

printf_s("Writing to file..."); 

while(current != NULL) 
{ 
    fwrite(&buf, sizeof(BOOK), 1, out); 
    current = current->next; 
} 

printf_s("Done!\n"); 
fclose(out); 

book_open - prend un pointeur vers un pointeur vers BOOK

int book_open(struct BOOK **current, char *file_name) 
{ 
    FILE *in; 
    BOOK *buf; // a pointer with malloc'd memory - can't reuse the local variable version! 
    BOOK *vnext = *current; 
    int i; 

    in = fopen("west", "rb"); // I hope that's the name of your file 
    printf_s("Reading database from %s...", file_name); 
    if(!in) 
    { 
     printf_s("\nERROR!"); 
     return 1; 
    } 

    while(1) 
    { 
     buf = malloc(sizeof(BOOK)); 
     i = fread(&buf,sizeof(BOOK), 1, in); 
     if(feof(in)) 
     { 
      free(buf); // never made it in 
      break; 
     } 
     buf->next = NULL; // the 'next' written to file is certainly not the same 

     // point current to it if empty, else point to next 
     if(*current == NULL) *current = buf; 
     else 
     { 
      wnext->next = buf; 
      wnext = buf; // next iteration you'll be setting buf->next 
     } 
    } 
    fclose(in); 
    printf_s("Done!"); 

    return 0; 
} 

Je pense que ce mieux.

0

Il semble que vous essayiez de transmettre une liste existante qui est remplie ou non, la fonction de lecture essaie alors d'allouer et de créer une liste. Aucune de ces situations ne semble vraiment correcte.

S'il s'agit du premier (passage dans une liste existante), alors la boucle while(current->next != NULL) va scanner jusqu'à la fin. Si vous essayez de créer une nouvelle liste, il semble que cela nécessite un travail supplémentaire pour lier les nouveaux nœuds ensemble.

+0

Pouvez-vous m'aider avec CODE ??? Pas seulement des mots ??? Tnx en avance – ScReYm0

Questions connexes