【发布时间】:2020-03-21 13:37:47
【问题描述】:
我正在编写一个 C 程序,它逐行读取具有特定格式的文本文件。
我做了一个do { ... } while(!feof(file)); 循环,但它总是循环一个太多次。这是一个问题,因为我已经做到了,所以当我的程序期望读取某些内容但什么也没有得到时,它会抛出一个错误,所以现在它每次都会抛出一个错误,因为它到达了我循环顶部的文件末尾.
我认为这是因为只有在您尝试 fscanf 某些东西但那里什么都没有时才会触发 eof 标志。我该如何解决这个问题?将最终的 fscanf 放在底部是行不通的,因为如果它不在文件末尾,它将把所有读数都弄乱,并将所有内容都移动一个。
do {
read = fscanf(/*...*/);
if (read != 1)
{
return -1;
}
// Read grades
read = fscanf(/*...*/);
if (read != 3)
{
return -1;
}
// Read student kind
int student_kind = 0;
read = fscanf(/*...*/);
if (read != 1)
{
return -1;
}
if (student_kind < 0 | student_kind > 2)
{
printf("Invalid student kind");
return -1;
}
SCIPER sciper_teammate = 0;
read = fscanf(/*...*/);
if (read != 1)
{
return -1;
}
} while (!feof(file));
【问题讨论】:
-
您可以使用来自
fscanf的返回值来控制循环。while(fscanf(...) == expectedNumberOfItems) {...}。不管怎样,你应该总是检查scanf函数族的返回值。 -
投票支持重新打开,因为问题的主题是
do-while循环内的读取操作,而不是while-loop。这对提供的副本有所不同。 -
@exnihilo 对我来说,副本不相关,因为它即将使用 feof before 任何读取。同意正确的方法是检查任何读取的结果,如果可能的话,使用 while(fscanf(...) == ...) ... 如 WeatherVane 或类似 的建议for () { ... if (fscanf(...) != ...) 中断; ... } ofc
-
@exnihilo 我们不知道 OP 对该语句的含义以及问题本身的整个表达方式。这是一个大问题。我同意,这个问题应该因为“需要更多关注”而结束。