2010-05-16 4 views
0

Хорошо у меня есть проблемы с моим кодом для чтения двоичного файла ...бинарные файлы записи/чтения проблемы

Во-первых, я покажу вам мой написания кода:

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); 
    } 
} 

и вот моя «версия» для чтения:

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; 
} 

Мне просто нужно, чтобы сохранить мой связанный список в двоичный файл и быть в состоянии прочитать его обратно ... пожалуйста, помогите мне. Программа просто не прочитать его или ее крах каждый раз, когда другая ситуация ...

+1

Покажите нам определение struct BOOK. –

+0

Я предполагал, что 'BOOK' имеет' char [] 'объявленный вместо' char * '... – Phil

ответ

2
  1. Ваш do..while петля может быть выполнена лучше. Если вы собираетесь проверить в конце, не забудьте также в начале. Если вы обнаружите, что вам нужно это сделать, вы, вероятно, не используете правильное управление потоком. Например, здесь вы должны просто сказать while(current != NULL) { }

  2. Что вы пытаетесь сделать с if(current != NULL) { }? Вы устанавливаете текущий узел в своем цикле на новый BOOK и делаете его следующий элемент NULL. Зачем? Почему бы не просто отразить цикл, который у вас есть в методе письма?

  3. Посмотрите, что вы делаете, если current == NULL неявно - вы находитесь strcpy ing в вашем методе чтения. Не делай этого.

  4. Вы, кажется, говорите fclose(in) в пределах цикла while в book_open.

Я получу больше, как только скомпилирую его.


Хорошо, я редактировал код несколько делает 2 предположения

  1. Это не проблема домашних заданий
  2. BOOK только 1 указатель (next) и все остальное представляет собой массив с выделенной памяти к нему

book_saving - просто петли и пишет

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 - принимает указатель на указатель на 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; 
} 

Я думаю, что это лучше.

0

Похоже, вы пытаетесь либо пройти в существующий список, который заполняется, либо если он не передан, тогда функция чтения пытается выделить и создать список. Ни одна ситуация не выглядит совершенно правильной.

Если это первый (передача существующего списка), то цикл while(current->next != NULL) будет сканировать до конца. Если вы пытаетесь создать новый список, то похоже, что ему нужно выполнить дополнительную работу, чтобы связать новые узлы вместе.

+0

Можете ли вы мне помочь с CODE ??? Не только слова ??? Tnx в расширенном – ScReYm0

Смежные вопросы