Программа не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Я уже просто не понимаю, ну все же там правильно, все должно работать, но нет, не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь. Код поместил на pastebin. http://pastebin.com/9KkbMGqD
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
const int N=15;
 
struct luggage
   {
           char FullName[16];
           int Seats;
           int Weight;
   }   Base;
   
void AddRecordDatabase(FILE *);
 
int main()
   {
           system("CLS");
           
           int Temp=0, Flag=0;
           int i=0, j=0, k=0;
           
           char DatabaseName[]="Databaseluggage.dat";
           char Choice;
           
           FILE *TextDatabase;
           TextDatabase=fopen(DatabaseName, "wb+");
       
       while(true)
          {
               
              printf("Add a record to a database? Enter Y/N \n");
              scanf("%s", &Choice);   printf("\n");
             
              if (Choice=='N')
                 {
                         printf("Entering values database stopped \n");
                         system("CLS");
                         fclose(TextDatabase);
                        break;
                 }
              else
                 {
                         AddRecordDatabase(TextDatabase);
                         system("CLS");
                 }
          }
       
       TextDatabase=fopen(DatabaseName, "rb");
       
       while(!feof(TextDatabase))
          {
                  fread(&Base, sizeof(Base), 1, TextDatabase);
                  printf("%d. %s %d %d \n", i, Base.FullName, Base.Seats, Base.Weight);
                  i++;
          }

           getch();
           
           printf("\n");
           system("PAUSE");
          return EXIT_SUCCESS;
   }

void AddRecordDatabase(FILE *TextDatabase)
   {
      printf("Enter the full name \n");
      scanf("%s", &Base.FullName);   printf("\n");
       
      printf("Enter the number of seats occupied luggage \n");
      scanf("%d", &Base.Seats);   printf("\n");;
       
      printf("Enter the weight of luggage \n");
      scanf("%d", &Base.Weight);   printf("\n");
     
      fwrite(&Base, sizeof(Base), 1, TextDatabase);
   }
P.S. Одногруппник сделал вместо Choice, Choice[2] и сравнивать начал через strcmp, и выводить началось по две записи, вот вообще, эта переменная никак не влияет на ход работы.

Решение задачи: «Программа не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь»

textual
Листинг программы
 
...
    scanf("%c", &Choice);
...
    if (!(TextDatabase=fopen(DatabaseName, "rb")))
    {
        printf("Error! \n");
        system("CLS");
        return EXIT_SUCCESS;
    }
       
    while(fread(&Base, sizeof(Base), 1, TextDatabase))
    {
        printf("%d. %s %d %d \n", i, Base.FullName, Base.Seats, Base.Weight);
        i++;
    }
...
void AddRecordDatabase(FILE *TextDatabase)
{
    printf("Enter the full name \n");
    scanf("%s", &Base.FullName);   printf("\n");
       
    printf("Enter the number of seats occupied luggage \n");
    scanf("%d", &Base.Seats);   printf("\n");;
       
    printf("Enter the weight of luggage \n");
    scanf("%d", &Base.Weight);   printf("\n");
     
    fwrite(&Base, sizeof(Base), 1, TextDatabase);
    
    getchar(); // !!!
}

Объяснение кода листинга программы

  1. Программа открывает файл базы данных для чтения (режим rb).
  2. В каждой итерации цикла программа читает структуру базы данных из файла.
  3. Данные из структуры выводятся на экран.
  4. Если файл пуст, то программа завершается.
  5. Функция добавления записи в базу данных запрашивает у пользователя данные и записывает их в файл.
  6. После добавления записи программа продолжает чтение файла с места, где была добавлена запись.
  7. Последняя запись структуры выводится на экран несколько раз, поскольку программа зацикливается.
  8. Для выхода из программы используется функция getchar.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы