Двойная печать - C - PullRequest
       15

Двойная печать - C

0 голосов
/ 04 мая 2018

Я читаю из файла, однако, если он не существует, он должен напечатать «Ошибка чтения», но по какой-то причине он печатает ошибку чтения дважды, и я не знаю, почему

int loadFlights(char flightDatabase[50], int totalflights,  flight_t f[MAX_NUM_FLIGHTS]) 
{
    int counter;

    FILE *fp; 
    fp = fopen("database.txt", "r");

    if(fp == NULL) { /************************statement with problem*/
        printf("Read error\n");
        return 1;
    }   
    fscanf(fp, "%d",  &totalflights);
    if (totalflights > 5) {
        totalflights = 5;
    }
    for(counter = 0; counter <= totalflights-1; counter++) 
    {
        fscanf(fp, "%s %d %d %d %d %s %d %d %d %d", f[counter].flightcode, 
        &f[counter].departure_dt.month, &f[counter].departure_dt.date, 
        &f[counter].departure_dt.hour, &f[counter].departure_dt.minute, 
        f[counter].arrival_citycode, &f[counter].arrival_dt.month, 
        &f[counter].arrival_dt.date, &f[counter].arrival_dt.hour, 
        &f[counter].arrival_dt.minute);
    }
    fclose(fp);
    return totalflights;
}

Я попытался поместить оператор if вокруг ошибки чтения, если оператор, сообщающий, что он уже был напечатан, не печатает снова, хотя он все еще, кажется, печатает.

int main(void)
{
    flight_t f[MAX_NUM_FLIGHTS];
    int totalflights = 0, menu;
    char flightDatabase[50] = "database.txt";
    while (menu != 5)
    {
        print_Menu();
        scanf("%d", &menu);
        while ((menu < 0) || (menu > 5)) {
            printf("Invalid choice\n");
            print_Menu();
            scanf("%d", &menu);
        }
        if (menu == 1) 
        {
            addFlight(f, totalflights);
            totalflights++; 
        }
        else if (menu == 2) 
        {
            displayFlight(f, totalflights); 
        }
        else if (menu == 3) 
        {
            saveFlight(f, flightDatabase,  totalflights);
        }
        else if (menu == 4) 
        {
            loadFlights(flightDatabase, totalflights, f);
            totalflights = loadFlights(flightDatabase, totalflights,f);
        }
    }
    return 0;
}

Это код, по которому я вызываю функцию.

1 Ответ

0 голосов
/ 04 мая 2018

Вот в чем проблема:

// Some code

else if (menu == 4) 
{
    loadFlights(flightDatabase, totalflights, f);
    totalflights = loadFlights(flightDatabase, totalflights,f);
}

Это два последовательных вызова loadFlights, в то время как первый вызов не улавливает возвращаемое значение. Вы можете избавиться от первого, и он должен вести себя так, как вы ожидаете.

Кроме того, я вижу проблему:

while (menu != 5)

На данный момент, menu не инициализирован, будет содержать случайное значение. Возможно, вы захотите инициализировать его нулем, или 5, или любым другим, допустимым для этого типа данных.

Я пытался поместить оператор if вокруг ошибки чтения ...

Это патчи, которые действительно опасно иметь. Обычно ожидается, что он отладит код и выяснит, в чем именно проблема, а не добавит патч для устранения существующей ошибки.

...