Программа не может найти конец файла в цикле и выводит последнюю запись структуры зацикливаясь - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д