gpt4 book ai didi

c - feof() 在 C 语言中的工作原理

转载 作者:太空狗 更新时间:2023-10-29 16:42:22 26 4
gpt4 key购买 nike

feof() 是检查文件指针当前位置的 eof 还是检查当前文件指针旁边的位置?

感谢您的帮助!

最佳答案

每个 FILE 流都有一个内部标志,指示调用者是否已尝试读取超过文件末尾的内容。 feof 返回该标志。该标志不指示当前文件位置是否为文件末尾,仅指示先前读取是否已尝试读取超过文件末尾。

举个例子,让我们来看看当读取一个包含两个字节的文件时会发生什么。

f = fopen(filename, "r"); // file is opened
assert(!feof(f)); // eof flag is not set
c1 = getc(f); // read first byte, one byte remaining
assert(!feof(f)); // eof flag is not set
c2 = getc(f); // read second byte, no bytes remaining
assert(!feof(f)); // eof flag is not set
c3 = getc(f); // try to read past end of the file
assert(feof(f)); // now, eof flag is set

这就是为什么以下是读取文件时使用 eof 的错误方法的原因:

f = fopen(filename, "r");
while (!feof(f)) {
c = getc(f);
putchar(c);
}

由于 feof 的工作方式,文件结束标志仅设置一次 getc尝试读取文件末尾。 getc 将返回 EOF,这是不是字符,循环构造导致 putchar 尝试写入它out,导致错误或垃圾输出。

每个 C 标准库输入法都返回成功或失败:getc 返回特殊值 EOF 如果它试图读取过去文件末尾,或者读取时是否有错误。特殊值是对于文件结尾和错误也是如此,这是正确使用的地方feof进来了:你可以用它来区分文件结束和错误情况。

f = fopen(filename, "r");
c = getc(f);
if (c == EOF) {
if (feof(f))
printf("it was end-of-file\n");
else
printf("it was error\n");
}

对于错误情况,FILE 对象还有另一个内部标志:错误。测试错误而不是“不是文件结尾”通常更清楚。在 C 中通读文件的惯用方法是这样的:

f = fopen(filename, "r");
while ((c = getc(f)) != EOF) {
putchar(c);
}
if (ferror(f)) {
perror(filename):
exit(EXIT_FAILURE);
}
fclose(f);

(为简洁起见,此处示例中省略了一些错误检查。)

feof 函数很少有用。

关于c - feof() 在 C 语言中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12337614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com