【问题标题】:Question regarding reading lines from a file in C关于从 C 中的文件中读取行的问题
【发布时间】:2020-05-02 00:34:54
【问题描述】:
  int line = 0;
        char input[MAX_INPUT_SIZE];
        while(fgets(input, MAX_INPUT_SIZE, inputFile))
        {
            printf("%s", input);
            line++;
        }

这是我为尝试用 C 语言读取文件而编写的一段代码。(此时我已经检查了指向文件的指针是否不为空)。

另外,MAX_INPUT_SIZE = 1025.

我想知道,当我读取一个非常大的文件时会发生什么,每次使用 fgets 时input 会发生什么?

fgets 是否只是随机写入input? 我怎么知道我读取的每一行在input? 开始和结束的位置

希望得到一些见解,谢谢。

【问题讨论】:

    标签: c file


    【解决方案1】:

    我想知道,当我读取一个非常大的文件时会发生什么,每次使用 fgets 时input 会发生什么?

    input 之前的内容被覆盖。

    我如何知道我阅读的每一行在输入中的开始和结束位置?

    短篇小说

    fgets()(直到并包括'\n' 的文本)读入字符串(直到附加的终止空字符)。

    该行的字符以input[0] 开头。

    读取的字符数为strlen(input)


    更长的故事

    C 中的 通常以'\n' 结尾。输入的最后可能/可能没有'\n'

    每一行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。 C17dr § 7.21.2 2

    fgets() 提前停止

    char *fgets(char * restrict s, int n, FILE * restrict stream);
    

    fgets() 读取数据,然后附加一个空字符

    fgets() 在 4 种情况下停止读取:

    1) 读取了'\n'

    2) n-1 读取的字符。

    3) 文件结束。

    4) 出现输入错误(罕见)。

    对于学习者代码,提供一个类似于 OP 代码的大输入缓冲区并检查返回值就足够了。对我来说,我会使用最大 预期 大小的 2 倍大小长度缓冲区。

    char input[MAX_INPUT_SIZE * 2];
    while(fgets(input, sizeof input, inputFile)) {
      input[strcspn(input, "\n")] = '\0'; // Lop off potential \n if desired.
      ...
    }
    

    读取空字符

    '\0' 在阅读时很少遇到,但可能。它弄乱了使用strlen() 来查找读取的字符数。现在处理可能超出 OP 需要的其他代码。

    【讨论】:

      【解决方案2】:

      在没有错误的情况下,读取会以换行符或缓冲区已满时停止。

      fgets(buf, SIZE, f);
      len = strlen(buf);
      if (buf[len - 1] == '\n') {
          //full line read from file
          //buf[len+1] to buf[SIZE-1] are not changed from their previous values
      } else {
          //very long line in file
          //repeat fgets for more of the line
          //if len != SIZE-1 there was some error
      }
      

      【讨论】:

        【解决方案3】:

        当您打开要读取的文件时,文件指针将指向该文件的开头。如果要更改要开始的行,请使用fseek

        int fseek(FILE *stream, long offset, int whence);
        

        fgets 将在这个文件中逐行获取(不是随机的)。

        来自man page

         char *fgets(char *s, int size, FILE *stream);
        

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

        【讨论】:

          猜你喜欢
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多