如何使用EOF运行C中的文本文件?
我有一个每行都有string的文本文件。 我想为文本文件中的每一行增加一个数字,但是当它到达文件末尾时,显然需要停止。 我试过对EOF进行一些研究,但不能真正理解如何正确使用它。
我假设我需要一个while循环,但我不知道如何做到这一点。
你如何检测EOF取决于你用什么来读取stream:
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
检查input调用的结果是否符合上述条件,然后调用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); ... }
这种forms不会像人们认为的那样工作,因为在你试图读取文件末尾之后 , feof()
才会返回true。 因此,循环执行一次太多,这可能会或可能不会导致你一些悲伤。
一个可能的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
和类似的function。 Exprience表明,在错误的时间把它称作是非常容易的,并且相信eof还没有被达到,所以处理了两次。
避免陷阱:使用char
的typesc。 getchar
返回下一个转换为unsigned char
,然后返回一个int
。 这意味着在大多数[理性]平台上, EOF
的值和c
有效的“ char
”值不会重叠,因此您将不会意外地检测到EOF
作为“正常” char
。
从文件读取后,您应该检查EOF。
fscanf_s // read from file while(condition) // check EOF { fscanf_s // read from file }