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