Подскажите как оптимизировать код (Все работает, но не нравится написание (файлы) - C (СИ)
Формулировка задачи:
В общем сама программа писалась для создания файла свободного доступа(Сама программа работает). Смущает в функции textFile и read наличие дополнительного if(!feof(Baza)) для проверки конца файла. Подскажите какой нибудь выход.
#include <stdio.h> #include <iostream> struct avia { int nomer; char gorodIZ [20]; char gorodV [20]; float vremyaVileta; float vremyaPriileta; } bilety; int enter(void) { int nomer; printf("Введите номер операции\n"); printf("1 - Сохранить в txt файл\n" "3 - Создать новую запись\n" "4 - Удалить запись\n" "5 - Чтение\n" "0 - Выход\n"); scanf("%d", &nomer); return nomer; } void read(FILE *Baza) { int num = 0; rewind(Baza); while (!feof(Baza)){ fseek(Baza, (num) * sizeof(struct avia), SEEK_SET); fread(&bilety, sizeof(struct avia), 1, Baza); if(!feof(Baza)){ if (bilety.nomer != 0) printf("%-5d%-6s%-6s%-6.2f%-6.2f\n", bilety.nomer, bilety.gorodIZ, bilety.gorodV, bilety.vremyaVileta, bilety.vremyaPriileta); num++; } } } void textFile(FILE *Baza) {FILE *write; if (!((write = fopen ("baza.txt", "w")) == NULL)){ rewind(Baza); while(!feof(Baza)){ fread(&bilety, sizeof(struct avia), 1, Baza); if(!feof(Baza)){ if (bilety.nomer != 0){ fprintf(write, "%-5d%-6s%-6s%-6.2f%-6.2f\n", bilety.nomer, bilety.gorodIZ, bilety.gorodV, bilety.vremyaVileta, bilety.vremyaPriileta); } } } fclose(write); } } void newRekord(FILE *Baza) { int num; printf("Введите новый рейс\n"); scanf("%d", &num); fseek(Baza, (num-1) * sizeof(struct avia), SEEK_SET); fread(&bilety, sizeof(struct avia), 1, Baza); if (bilety.nomer == num) printf("Рейс уже создан\n"); else{ printf("Введите:\n" "Город вылета(20 символов), Город прилета\n" "Время вылета в формате (ЧЧ.ММ), Время прилета\n"); scanf("%s%s%f%f", &bilety.gorodIZ, &bilety.gorodV, &bilety.vremyaVileta, &bilety.vremyaPriileta); bilety.nomer = num; fseek(Baza, (num - 1) * sizeof(struct avia), SEEK_SET); fwrite(&bilety, sizeof(struct avia), 1, Baza); } } void del(FILE *Baza) { int num,i; struct avia null = {0, "", "", 0, 0}; printf("Введите номер рейса\n"); scanf("%d", &num); fseek(Baza, (num-1) * sizeof(struct avia), SEEK_SET); fread(&bilety, sizeof(struct avia), 1, Baza); if (bilety.nomer == 0) printf("Запись пустая\n"); else{ printf("%-5d%-6s%-6s%-6.2f%-6.2f\nУдалить запись?\n1-да 2-нет\n", bilety.nomer, bilety.gorodIZ, bilety.gorodV, bilety.vremyaVileta, bilety.vremyaPriileta); scanf("%d",&i); switch(i){ case 2: break; case 1: fseek(Baza, (num-1) * sizeof(struct avia), SEEK_SET); fwrite(&null, sizeof(struct avia), 1, Baza); break; default: break; } } } int main() { int choice; FILE *baza; setlocale(LC_ALL,""); //для вывода русских символов if (!((baza = fopen ("baza.dat", "r+")) == NULL)) while((choice = enter()) != 0) switch (choice){ case 1: textFile(baza); break; case 3: newRekord(baza); break; case 4: del(baza); break; case 5: read(baza); break; default: break; } fclose(baza); system("PAUSE"); return 0; }
Решение задачи: «Подскажите как оптимизировать код (Все работает, но не нравится написание (файлы)»
textual
Листинг программы
rewind(Baza); while (fread(&bilety, sizeof(struct avia), 1, Baza) == 1) { if (bilety.nomer != 0) printf("%-5d%-6s%-6s%-6.2f%-6.2f\n", bilety.nomer, bilety.gorodIZ, bilety.gorodV, bilety.vremyaVileta, bilety.vremyaPriileta); num++; }
Объяснение кода листинга программы
- В начале программы используется функция
rewind(Baza)
, которая возвращает файловый указатель в начало файла. Это необходимо для повторного чтения данных из файла при каждом проходе цикла. - Затем следует цикл
while
, который будет выполняться до тех пор, пока функцияfread(&bilety, sizeof(struct avia), 1, Baza)
возвращает ненулевой результат. Это означает, что файл не исчерпан, и в него можно записать еще как минимум один элемент. - Внутри цикла происходит проверка: если поле
bilety.nomer
не равно нулю, то выполняется блок кода. Это условие отсеивает билеты с номером 0. - В блоке кода выводится на экран информация о билете: его номер (
bilety.nomer
), город отправления (bilety.gorodIZ
), город назначения (bilety.gorodV
), время вылета (bilety.vremyaVileta
), и время прибытия (bilety.vremyaPriileta
). Форматирование вывода соответствует заданному шаблону. - После вывода информации о билете увеличивается счетчик
num
. - В конце цикла ничего не происходит.
- По завершении цикла программа возвращает управление в основную программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д