Программа не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь - C (СИ)
Формулировка задачи:
Я уже просто не понимаю, ну все же там правильно, все должно работать, но нет, не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь. Код поместил на pastebin.
http://pastebin.com/9KkbMGqD
P.S. Одногруппник сделал вместо Choice, Choice[2] и сравнивать начал через strcmp, и выводить началось по две записи, вот вообще, эта переменная никак не влияет на ход работы.
#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);
}Решение задачи: «Программа не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь»
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(); // !!!
}
Объяснение кода листинга программы
- Программа открывает файл базы данных для чтения (режим
rb). - В каждой итерации цикла программа читает структуру базы данных из файла.
- Данные из структуры выводятся на экран.
- Если файл пуст, то программа завершается.
- Функция добавления записи в базу данных запрашивает у пользователя данные и записывает их в файл.
- После добавления записи программа продолжает чтение файла с места, где была добавлена запись.
- Последняя запись структуры выводится на экран несколько раз, поскольку программа зацикливается.
- Для выхода из программы используется функция
getchar.