我正在编写一个程序来逐行读取文件。我知道 fgets() 会一直读到新行、n-1 个字符或 EOF。让我困惑的是 fgets() 如何知道前进到新行/它在文件中的位置?
更清楚地说,我知道在 Java 中您必须明确告诉扫描仪读取下一行。但是在 C 中,我只是将 fgets() 放在一个 while 循环中,并且相信它可以完成它的工作。
我怎样才能在逻辑上让自己放心 fgets() 实际上正在前进到下一行,而不是在那个 while 循环中一遍又一遍地阅读同一行(是的,我知道我可以打印出来)?
的语义fgets()非常简单:从FILE*流指针读取字节,直到:
n-1已读取字节并将其存储到其中)。EOF由fgetc()调用或等效项返回)。文件结束和读取错误条件可以通过调用ferr()和/或返回feof()后区分。fgets()NULL从流中读取字节后,空终止符始终存储到数组中,除非立即到达文件末尾(fgets()返回NULL),或者缓冲区大小指定为大小为 0。
fgets()表现得好像使用 一次读取一个字节的流fgetc()。
fgets()消耗从流中读取的字节并将它们存储到目标数组中。它无法再次读取相同的字节,除非您使用rewind()、fseek()或明确向后查找流fsetpos(),如果流完全支持查找。附加到常规文件的流通常支持搜索,但以文本模式打开的文件需要在某些系统上进行特定处理,尤其是 Microsoft Windows。另请注意,推回流中的字节将在实际流中的任何字节之前ungetc()读取fgets()。
fgets() 如果行足够短以适合空终止符之前的数组,则将换行符存储到目标数组中。
fgets()如果行超过目标数组中的可用空间,则将长行分成更小的块。处理长行很棘手且容易出错。请注意,当fgets()由于目标数组空间不足而读取部分行时,下一次调用fgets()将在前一次调用停止的点继续从同一行读取。
如果从 返回时fgets(),目标数组不以换行符结尾,则会发生以下情况之一:
对这些案例处理不当可能会导致潜在的未定义行为和/或可利用的缺陷。