- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
这是一个更大的电影 Sprite 程序的一部分,由于某种原因,程序在到达这个 while 循环时崩溃了,我不明白我的问题是什么。 #include #include #include #incl
这个问题已经有答案了: feof detecting false end of file (2 个回答) 已关闭10 年前。 我有一个函数应该读取文件并检测文件何时结束。 该函数当前仅读取倒数第二行并
我之前问过一个不同的问题,但我对这个问题的看法有点偏题,所以我提出了一个新问题,因为我问的是一个完全不同的问题。 我有一个函数可以读取文本文件中的给定行(由 ac 变量给出)。它执行行的读取,然后检查
大家好,我正在编写一个 c 程序,我试图一次从一个文本文件中打印两行,问题是当在最后一行时,如果行是奇数,3 行 5 行。它会打印最后一行两次。我找不到针对这个特定问题的 if 函数的比较。是 boo
这个问题在这里已经有了答案: Why is “while( !feof(file) )” always wrong? (5 个答案) 关闭 5 年前。 我是 C 的新手。我偶然发现了 feof 的某
我正在尝试通过套接字发送文件,方法是一次读取一个字符,直到缓冲区(字符数组)已满,发送它,然后重复直到文件末尾。但出于某种原因,feof 在文件结束前变为真(我相信可能是在缓冲区数组已满时)。 int
我是 C++ 的初学者,正在努力更好地理解 feof()。我读过 feof() 标志仅在尝试读取文件末尾后才设置为 true 很多次初学者如果执行类似 同时(!feof(文件))。不过,我想了解的是,
所以我做了一件简单的事情,首先我通过 ssh2_exec 执行命令(在成功验证后),然后读取变量中的答案。下面是我的代码(没有验证) try { $stdout_stream = ss
This link讲述为什么 feof() 用作循环的退出指示器是一件坏事。 不安全==>在 while 中进行 feof() 检查,并在 while 内进行 fgets() 检查。 安全==>让fg
我的程序中出现错误(应该找到字符和整数文件中的所有整数),其中“feof”不起作用(while循环永远不会结束)或没有读取/找到整数,除非整个文件充满了整数。 我的代码... #include
void suffix_strip(FILE *fp) { FILE *fp1; char word[20],ch; int len; int i=0,j; f
我正在使用 feof 计算文件中的行数,如下所示。完成后,我需要逐行循环遍历同一个文件,并执行另一个取决于行数的操作。但是,while (!feof(f)) 不会在同一个文件流上运行第二次。有没有办法
我有以下枚举和结构: enum Destination { unknown = 0, hosok, parlament, var }; struct Client { char name[30];
我正在使用 fgets(); 从文本文件中读取行 我有一个循环:while(!feof(fp)) 问题是,即使在我到达并读取最后一行之后,程序仍继续进入循环,并且在调试中文件 ptr 仅显示点而不是数
我这里真的有问题。从文件中读取字符时,我似乎并没有真正找到退出循环的最佳方法。我知道每个教程都建议我不应该使用 while( !feof() ) 但他们除了在 while 中放置 fgets() 之外
FILE *test; student st; int i = 0; test = fopen("example.bin", "rb"); while (feof(test)) { fread
我在从文件中读取行时遇到问题。基本上,我的代码多读了一行,所有变量都为“0”,即 如果我的文件是: 0, 0, 3, 64, 0, 0, 0, 0 2, 0, 6, 64, 0, 0, 0, 0 4,
这个问题在这里已经有了答案: Why is “while( !feof(file) )” always wrong? (5 个答案) 关闭 5 年前。 所以我阅读了多篇关于为什么 feof 不能正常
最近几天我一直在处理一个奇怪的 PHP 问题,feof() 函数在文件结束之前返回 true。下面是我的代码的框架: $this->fh = fopen("bigfile.txt", "r");
我打开一个文件,在指针ptr 的地址找到流。我正在尝试查看文件是否为空白。使用以下内容 if (fgetc(ptr) != EOF) 按预期工作。当文件为空时,不执行该语句。当文件不为空时,语句不执行
我是一名优秀的程序员,十分优秀!