试图了解fgets()

时间:2017-03-20 01:33:31

标签: c fgets file-read

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

为了更清楚,我知道在Java中你必须明确告诉扫描仪阅读下一行。但是在C语言中,我只是将fgets()置于while循环中并相信这是它的工作。

我怎样才能在逻辑上向我保证fgets()实际上是在推进到下一行,而不是在while循环中一遍又一遍地读同一行(是的,我知道我可以打印出来的东西)?

1 个答案:

答案 0 :(得分:4)

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()返回时,目标数组不以换行符结束,则会发生以下情况之一:

  • 当前行太长,并且只从流中读取了与数组中匹配的字节数。
  • 读取的行是文件中的最后一行,文件不以换行符结束。
  • 从文件中读取了一个空字节。

错误处理这些案件可能会导致潜在的未定义行为和/或可利用的漏洞。