我正在读取文件,但是如果它不存在则意味着打印“读取错误”。但由于某种原因,它打印读错两次,我不知道为什么
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;
}
这是我调用该函数的代码。
答案 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语句
这些是补丁工程,真的很危险。它通常需要调试代码并找出确切的问题,而不是添加补丁来掩盖现有错误。