双面印刷 - C.

时间:2018-05-04 12:47:55

标签: c null return printf

我正在读取文件,但是如果它不存在则意味着打印“读取错误”。但由于某种原因,它打印读错两次,我不知道为什么

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语句周围添加一个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 :(得分:1)

这就是问题所在:

// Some code

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

这是对loadFlights的两次连续调用,而第一次调用没有捕获返回值。你可以摆脱第一个,它应该按照你期望的方式行事。

此外,我发现了一个问题:

while (menu != 5)

此时,menu未初始化,将保留随机值。您可能希望将其初始化为零或5,或者对该数据类型合法的任何内容。

  

我尝试在Read Error ...

周围添加一个if语句

这些是补丁工程,真的很危险。它通常需要调试代码并找出确切的问题,而不是添加补丁来掩盖现有错误。