Проблема чтения двоичного файла с использованием функции fread - PullRequest
0 голосов
/ 01 июля 2019

Мне поручено создать программу инвентаризации, которая хранит данные с использованием структуры и сохраняет данные в двоичном файле. Затем программа должна иметь возможность загружать данные, т.е. элементы структуры из двоичного файла. Я могу сохранить входные данные в двоичный файл с помощью функции fwrite; однако у меня возникла проблема при загрузке файла в программу с использованием функции fread.

Я уже искал подобные проблемы, но я не могу найти похожий случай, в котором fread используется для передачи элементов структуры, сохраненных в структурную переменную в программе.

Это код моей структуры

struct details {
    char name[30];
    double price;
    int code;
    int qty;
};

details item[SIZE];

Функция добавления предмета в инвентарь

int AddItem(int n){
    details inputitem;
    printheader();
    printf("Item Name: ");
    scanf("%s", inputitem.name); //check %[^\n]
    printf("\nItem Price: ");
    scanf("%lf", &inputitem.price);
    printf("\nItem Code: ");
    scanf("%d", &inputitem.code);
    printf("\nQuantity: ");
    scanf("%d", &inputitem.qty);
    printf("\nItem Added! The ID of the item is %d.\n", n+1);
    item[n] = inputitem;
}

Функция отображения инвентаря

int DisplayInventory(int n){
    printheader();
    printf("ID |    NAME           |   CODE   |  QUANTITY |  PRICE \n");
    printf("------------------------------------------------------------\n");
    for(int i=0; i<n; i++){
        printf("%d   %-18s   %-10d  %-10d  %-10lf \n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price);
    }
}

Функция сохранения в двоичный файл

int SaveFile(int n){
    FILE *fp;
     fp=fopen("C:\\Users\\Royce\\Documents\\CPEPROG2 Goden Final Project\\Inventory.txt","wb");

      if(!fp) {
             printf("Cannot open file.\n");
             system("pause");
             exit(1);
      }


      for(int i=0; i<n; i++){
          fwrite(&item[i], sizeof(struct details), 1, fp);
      }



      fclose(fp);
      printf("File is saved!\n");

}

Функция загрузки двоичного файла

int LoadFile(int n){
     FILE *fp;
     fp=fopen("C:\\Users\\Royce\\Documents\\CPEPROG2 Goden Final Project\\Inventory.txt","rb");

      if(!fp) {
             printf("Cannot open file.\n");
             system("pause");
             exit(1);
      }


      struct details inputitem;
      int i = 0;
      while(fread(&inputitem, sizeof(struct details),1, fp)){

           item[i] = inputitem; 

           i++;
/*    printf("%d   %-18s   %-10d  %-10d  %-10lf \n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price); */

      }
      fclose(fp);

      printf("File is loaded!\n");  
}

Я ожидаю, что программа покажет в функции DisplayInventory детали структуры, сохраненной в двоичном файле. Тем не менее, ничего не появляется вообще.

Когда я пытаюсь напечатать структуру в функции LoadFile (используя закомментированную строку), все переменные показывают 0.

EDIT Основная функция

int main (){



    int choice; //gets the choice of user from the menu
    bool condition = 1; //loops the menu
    //details item[50]; 
    int count=0; //counts the number of items in the inventory

    do{
        printheader(); //prints the title of the program
        printmenu(); //prints the menu (list of commands)
        scanf("%d", &choice);
        switch(choice){
            case 1: system("cls");
                    AddItem(count);
                    count++; 
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 2: system("cls");
                    //EditItem();
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 3: system("cls");
                    //DeleteItem();
                    system("PAUSE"); 
                    system("cls");
                    break;          
            case 4: system("cls");
                    //ViewItem();
                    system("PAUSE"); 
                    system("cls");
                    break;  
            case 5: system("cls");
                    DisplayInventory(count);
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 6: system("cls");
                    SaveFile(count);
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 7: system("cls");
                    LoadFile(count);
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 8: printf("\nThank you!");
                    exit(0);
                    break;
            default: printf("\nInvalid Input!\n");  
                     getch();
                     system("cls");     

        }
    }while(condition = 1);


    return 0;
}

1 Ответ

0 голосов
/ 02 июля 2019

Программа никогда не увеличивает переменную count, поэтому при вызове DisplayInventory значение всегда равно 0 и ничего не отображается:

возвращает переменную i в LoadFile () и присваивает ее переменной count в области видимости main (): в LoadFile:

    ...
    printf("File is loaded!\n");  
    return i;
}

в основном:

...
case 7: system("cls");
    count = LoadFile(count);
    system("PAUSE"); 
    system("cls");

Обратите внимание, что аргумент 'n' в 'int LoadFile (int n)' не используется, вы можете удалить его.

...