【问题标题】:C - fgets() - What if the string is longer?C - fgets() - 如果字符串更长怎么办?
【发布时间】:2023-03-09 02:38:01
【问题描述】:

假设我有一个包含长度为 10 的字符串的文件:

abcdefghij

并使用fgets() 逐行读取我的文本文件,缓冲区大小为 4。 我将不得不循环调用fgets() 以确保读取整行。 但是,在第一次调用时,它会读取前 3 个字符 (buffer size -1) 对吗?即使没有到达我的字符串的真正结尾,它是否还会在我的 4 字符缓冲区的最后一个位置附加一个空终止字符,或者在我的缓冲区末尾用 4 个字符填充它并且没有空终止字符?哪个会导致无法调用strlen()?

谢谢你:)

【问题讨论】:

  • 了解这样一个简单问题的最佳方法是尝试一下;)
  • 没有最好的方法将它写在标准库文档中。
  • 由于文档中没有找到,写3行代码就知道了,不用在这里等答案了。

标签: c string file char gets


【解决方案1】:

查看 fgets 的手册页可以看到:

"如果有换行符,则保留。如果读取了任何字符并且 没有错误,在字符串结尾附加了一个`\0'字符"

(http://www.manpagez.com/man/3/fgets/)

【讨论】:

    【解决方案2】:

    来自 C 标准草案 (2010) n1547.pdf, 7.21.7.2.2:

    fgets 函数读取的次数最多小于 1 从流指向的流中由 n 指定的字符 into s 指向的数组。之后没有额外的字符被读取 换行符(保留)或文件结尾之后。一个空 在读入最后一个字符后立即写入字符 数组。

    【讨论】:

      【解决方案3】:

      它是在文档中。

      man fgets 的逐字记录(我的斜体字):

      fgets() 从流中最多读入一个小于 size 的字符 并将它们存储到 s 指向的缓冲区中。阅读停止后 EOF 或换行符。如果读取了换行符,则将其存储到 缓冲。 一个终止的空字节('\0')存储在最后一个之后 缓冲区中的字符。


      HP-UX 11 手册页中的逐字记录(我的斜体字):

      fgets()

      从流中读取字符到指向的数组中 到 s,直到读取 n-1 个字符,换行 字符被读取并传输到 s 或 end-of- 遇到文件条件。 然后字符串是 以空字符结束。


      来自POSIX specs:

      fgets() 函数应从流中读取字节到 s 指向的数组中,直到读取 n-1 个字节,或者读取 a 并传输到 s,或者遇到文件结束条件。 然后字符串以空字节终止。


      最后一点是from MSDN:

      fgets 函数从输入流参数中读取一个字符串并将其存储在 str 中。 fgets 从当前流位置读取字符,直到第一个换行符(包括第一个换行符)为止,或者直到读取的字符数等于 n – 1,以先到者为准。存储在 str 中的结果附加了一个空字符。换行符(如果读取)包含在字符串中。

      【讨论】:

      • @Virus721 好的,如果不确定返回到 C 标准,如 user694733 的回答所示,也可能会有所帮助。
      【解决方案4】:

      我使用了fseek(在文件中移动一个指针)。 程序看起来像(pseudo-code):

      read string[default length value];
      while string length == default length value
      {
          resize string;
          move back to the line start with fseek;
          read string;
      }
      

      我使用malloc 和realloc 来调整string 的大小(这是一个pointer)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 2014-07-17
        • 2012-02-21
        • 2012-04-30
        • 1970-01-01
        • 2012-07-31
        • 2021-12-08
        相关资源
        最近更新 更多