2016-06-11 130 views
0

我目前正在让自己进入C中的fileusage。 我找到了解释从文件中读取字符串的代码。然而,我真的好奇这是如何机械地工作。filePointer在while循环中自动进行?

while (!feof(fPointer)){ 
fgets(singleLine, 150, fPointer); 
puts(singleLine); 
} 

filepointer在循环结束时如何知道要进一步行?不应该在while循环结束时增加文件指针?

干杯

+0

您需要了解更多关于文件搜索和指针移动的信息。在读取了一定数量的字符后,'fgets'函数实际上将文件指针移动到下一行。在你的情况'150' –

+0

是不是'feof()'在'while'? – Cherubim

+0

对不起,我会编辑它。 所以基本上命令fgets自动增加文件指针? –

回答

4

约一个打开的文件甲FILE对象存储信息,包括“当前positition”。每个读/写操作通过读取/写入多少字节来增加当前位置。这就是为什么你可以继续调用fgets(或任何其他输入函数)在一个循环中,并获取块,块大块。

同样,您可以多次调用printf(或任何其他输出函数)来产生输出,并且它们不会相互覆盖。

你可以使用ftellfseek(受到一些限制,例如,标准C不要求ftell回到实际字节的文本文件偏移,只是一些“幻数”可以设置当前文件位置传递给fseek(但我从来没有在真正的实现中看到过))。

(你fPointer只是指向一个FILE对象不应该增加此指针,这只会指向随机内存。)

最后,while (!feof(fp))是错误的,因为feof查询“文件结束”的位存储在FILE对象中。它不预测下一次读取是否会由于到达文件末尾而失败。输入函数到达文件结尾后,“文件结束”位仅设置为真。这种类型的循环将在文件结束后再次运行,然后处理垃圾(或从先前的迭代中过时)数据。