试图理解 fgets()

dar*_*nak 2 c fgets file-read

我正在编写一个程序来逐行读取文件。我知道 fgets() 会一直读到新行、n-1 个字符或 EOF。让我困惑的是 fgets() 如何知道前进到新行/它在文件中的位置?

更清楚地说,我知道在 Java 中您必须明确告诉扫描仪读取下一行。但是在 C 中,我只是将 fgets() 放在一个 while 循环中,并且相信它可以完成它的工作。

我怎样才能在逻辑上让自己放心 fgets() 实际上正在前进到下一行,而不是在那个 while 循环中一遍又一遍地阅读同一行(是的,我知道我可以打印出来)?

chq*_*lie 6

的语义fgets()非常简单:从FILE*流指针读取字节,直到:

  • 目标数组已满(n-1已读取字节并将其存储到其中)。
  • 从流中读取换行符并存储到目标数组中。
  • 已到达文件末尾或发生读取错误(EOFfgetc()调用或等效项返回)。文件结束和读取错误条件可以通过调用ferr()和/或返回feof()后区分。fgets()NULL

从流中读取字节后,空终止符始终存储到数组中,除非立即到达文件末尾(fgets()返回NULL),或者缓冲区大小指定为大小为 0。

fgets()表现得好像使用 一次读取一个字节的流fgetc()

fgets()消耗从流中读取的字节并将它们存储到目标数组中。它无法再次读取相同的字节,除非您使用rewind()fseek()或明确向后查找流fsetpos(),如果流完全支持查找。附加到常规文件的流通常支持搜索,但以文本模式打开的文件需要在某些系统上进行特定处理,尤其是 Microsoft Windows。另请注意,推回流中的字节将在实际流中的任何字节之前ungetc()读取fgets()

fgets() 如果行足够短以适合空终止符之前的数组,则将换行符存储到目标数组中。

fgets()如果行超过目标数组中的可用空间,则将长行分成更小的块。处理长行很棘手且容易出错。请注意,当fgets()由于目标数组空间不足而读取部分行时,下一次调用fgets()将在前一次调用停止的点继续从同一行读取。

如果从 返回时fgets(),目标数组不以换行符结尾,则会发生以下情况之一:

  • 当前行太长,只能从流中读取适合数组的字节数。
  • 读取的行是文件中的最后一行,并且文件不以换行序列结尾。
  • 从文件中读取了一个空字节。

对这些案例处理不当可能会导致潜在的未定义行为和/或可利用的缺陷。