双重印刷-C

双重印刷-C,c,null,return,printf,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) { /*******

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

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;
}

这是我调用函数的代码

这就是问题所在:

// Some code

else if (menu == 4) 
{
    loadFlights(flightDatabase, totalflights, f);
    totalflights = loadFlights(flightDatabase, totalflights,f);
}
这是对
loadFlights
的两个连续调用,而第一个调用没有捕获返回值。你可以摆脱第一个,它应该按照你期望的方式运行

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

while (menu != 5)
此时,
菜单
未初始化,将保存一个随机值。您可能希望将其初始化为零或5,或者该数据类型的合法值

我试着在读取错误周围放一个if语句


这些都是补丁,拥有它们真的很危险。它通常被期望调试代码并找出确切的问题所在,而不是添加补丁来掩盖现有的错误。

与您的问题无关,但是您的变量
菜单
未初始化,这意味着它有一个不确定的值(看起来是随机的)。不要在没有初始化的情况下使用它。至于你的问题,我建议你,因为那样问题应该很明显。提示:您调用了多少次
loadFlights
?从此行:
loadFlights(flightDatabase,totalflights,f);totalflights=loadFlights(flightDatabase,totalflights,f)
看起来您要调用
loadFlights
两次,这意味着如果文件不存在,将向您发送双重消息。(就像你发布的代码底部的第四行)你调用函数
loadFlights
两次。每次,文件都不存在,因此您要打印两次错误。@AngusRyan当您编写
loadflights(…)
时,您调用
loadflights
并丢弃返回值。在下一行,当您编写
totalflights=loadflights(…)
时,您将再次调用它,并将返回值分配给
totalflights
while (menu != 5)