【问题标题】:Why in order to read multiple lines of a text with fgets we need to set fgets()!=NULL?为什么要使用 fgets 读取多行文本,我们需要设置 fgets()!=NULL?
【发布时间】:2019-01-23 16:29:26
【问题描述】:

如果我想从带有fgets 的文本中读取多行,并且根据我的教科书,我会这样做:

 char str[53];
 ...
 while(fgets(str, max, f)!=NULL){
   ...
 }

如果str只是一行n个字符的字符串,程序如何读取第二行?根据文档,循环到达行尾时不应该停止吗?

fgets 从流中读取字符并将它们作为 C 字符串存储到 str 直到 (num-1) 个字符被读取或换行符或 到达文件末尾,以先发生者为准。

【问题讨论】:

  • 你什么都没设置,你只是告诉它在到达文件末尾时停止(此时它返回NULL
  • 您不会使用fopen 阅读。您使用fopen 创建一个数据结构,将其传递给fgets 以从文件中读取。 fgets 每次调用时读取一行。您在 while 循环中多次调用它,它会在每次迭代中读取一行。当没有更多行要读取时,fgets 返回 NULL 并且循环终止。
  • @WilliamPursell 对不起,我的错。这是一个错字。已编辑。

标签: c


【解决方案1】:

根据文档:

成功时,函数返回 str。 如果在尝试读取字符时遇到文件结尾,则设置 eof 指示符 (feof)。如果这发生在可以读取任何字符之前,则返回的指针是空指针(并且 str 的内容保持不变)。 如果发生读取错误,则设置错误指示符(ferror)并返回一个空指针(但str指向的内容可能已经改变)。

str 是您指定为第一个参数的缓冲区。如果fgets读完,返回NULL。

【讨论】:

  • 如果我们将第一行设置为 30 个字符,第二行设置为 30 个字符,那么循环不会在第二个循环中停止吗?因为我们将str 定义为char str[53];
  • @kevin fgets() 不会附加到str,每次调用都会覆盖之前的内容。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2019-06-09
相关资源
最近更新 更多