gpt4 book ai didi

c - 试图理解 fgets()

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:56 29 4
gpt4 key购买 nike

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

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

我如何从逻辑上确保 fgets() 实际上正在前进到下一行,而不是在那个 while 循环中一遍又一遍地读取同一行(是的,我知道我可以打印出来)?

最佳答案

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

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

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

fgets() 的行为就像使用 fgetc() 一次读取一个字节的流。

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

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

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

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

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

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

关于c - 试图理解 fgets(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42894522/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com