Подскажите как оптимизировать код (Все работает, но не нравится написание (файлы) - 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++;      
}

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

  1. В начале программы используется функция rewind(Baza), которая возвращает файловый указатель в начало файла. Это необходимо для повторного чтения данных из файла при каждом проходе цикла.
  2. Затем следует цикл while, который будет выполняться до тех пор, пока функция fread(&bilety, sizeof(struct avia), 1, Baza) возвращает ненулевой результат. Это означает, что файл не исчерпан, и в него можно записать еще как минимум один элемент.
  3. Внутри цикла происходит проверка: если поле bilety.nomer не равно нулю, то выполняется блок кода. Это условие отсеивает билеты с номером 0.
  4. В блоке кода выводится на экран информация о билете: его номер (bilety.nomer), город отправления (bilety.gorodIZ), город назначения (bilety.gorodV), время вылета (bilety.vremyaVileta), и время прибытия (bilety.vremyaPriileta). Форматирование вывода соответствует заданному шаблону.
  5. После вывода информации о билете увеличивается счетчик num.
  6. В конце цикла ничего не происходит.
  7. По завершении цикла программа возвращает управление в основную программу.

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


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

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

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