3 回答
TA贡献1830条经验 获得超9个赞
如何检测EOF取决于您用来读取流的内容:
function result on EOF or error
-------- ----------------------
fgets() NULL
fscanf() number of succesful conversions
less than expected
fgetc() EOF
fread() number of elements read
less than expected
检查输入调用的结果是否符合上述适当条件,然后调用feof()以确定结果是否是由于击中EOF或其他错误而导致的。
使用fgets():
char buffer[BUFFER_SIZE];
while (fgets(buffer, sizeof buffer, stream) != NULL)
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
使用fscanf():
char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
使用fgetc():
int c;
while ((c = fgetc(stream)) != EOF)
{
// process c
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted the read
}
使用fread():
char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1
// element of size
// BUFFER_SIZE
{
// process buffer
}
if (feof(stream))
{
// hit end of file
}
else
{
// some other error interrupted read
}
请注意,所有形式都相同:检查读取操作的结果;如果失败,则检查EOF。您会看到很多示例,例如:
while(!feof(stream))
{
fscanf(stream, "%s", buffer);
...
}
这种形式不工作的人认为它的方式,因为feof()之前将不会返回true 后,你已经尝试读取过去的文件的末尾。结果,循环执行的次数过多,这可能会或可能不会引起您的痛苦。
TA贡献1890条经验 获得超9个赞
一种可能的C循环是:
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
{
/*
** Do something with c, such as check against '\n'
** and increment a line counter.
*/
}
}
现在,我将忽略feof和类似的功能。经验表明,在错误的时间调用它并认为尚未达到eof会对其进行两次处理非常容易。
避免陷阱:char用于c的类型。getchar将下一个字符转换为unsigned char,然后返回int。这意味着在大多数[健全]平台上,EOF和的char值c不会重叠,因此您永远不会意外检测到EOF“正常” char。
TA贡献1776条经验 获得超12个赞
从文件读取后,应检查EOF。
fscanf_s // read from file
while(condition) // check EOF
{
fscanf_s // read from file
}
- 3 回答
- 0 关注
- 472 浏览
添加回答
举报