【问题标题】:How to take first row from this list of text?如何从此文本列表中获取第一行?
【发布时间】:2020-08-24 15:24:44
【问题描述】:

我有一个包含文本的列列表,但我只是从该列表中获取第一行。该怎么做?

#include <stdio.h>

int main()
{
  FILE *fr;
  char c;
  fr = fopen("prog.txt", "r");
  while( c != EOF)
  {
    c = fgetc(fr); /* read from file*/
    printf("%c",c); /*  display on screen*/
  }
  fclose(fr);
  return 0;
}

【问题讨论】:

  • 查看man 3 getline。也许这就是你想要的
  • while ((c = fgetc(fr)) != EOF) 将是一个开始 - 可能 while ((c = fgetc(fr)) != EOF &amp;&amp; c != '\n') 将是您所追求的,但您的意思并不十分清楚。或使用fscanf() 阅读“列”。不要忘记检查文件是否已成功打开。
  • 它没有给我第一行。我想要第一行。
  • c 应该是int,而不是char,才能正确处理EOF

标签: c function eof file-read


【解决方案1】:

你的停止条件是EOF,所有内容都会读到文件末尾,你需要一直读到找到换行符为止,另外EOF-1)应该和int比较类型。

你需要这样的东西:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fr;
  int c;

  if(!(fr = fopen("prog.txt", "r"))){ //check file opening
    perror("File error");
    return EXIT_FAILURE; 
  }

  while ((c = fgetc(fr)) != EOF && c != '\n')
  {
    printf("%c",c); /*  display on screen*/
  }
  fclose(fr);
  return EXIT_SUCCESS;
}

这是尊重您通过char 读取char 行的代码,您还具有允许您读取整行的库函数,例如fgets() 用于可移植代码,or getline() if you are not on Windows,或者@ 987654322@,当然你也可以像this onethis one一样自己制作。

【讨论】:

    【解决方案2】:

    不管有什么价值,这里有一个使用getline的例子

    #include <stdio.h>
    
    int main()
    {
      FILE *fr;
      char *line = NULL;
      size_t len = 0;
      ssize_t nread;
    
      if (!(fr = fopen("prog.txt", "r"))) {
        perror("Unable to open file");
        return 1;
      }
      nread = getline(&line, &len, fr);
      printf("line: %s, nread: %ld\n", line, nread);
    
      fclose(fr);
      return 0;
    }
    

    一些注意事项:

    • 如果您愿意,getline() 可以自动分配您的读取缓冲区。
    • getline() 返回行尾分隔符。如果您不想要它,您可以随时将其剥离。
    • 总是检查诸如“fopen()”之类的 I/O 调用的状态是个好主意。

    【讨论】:

    • 最好使用 "%zu"size_t 的某个匹配 printf 说明符。还建议free(line)
    【解决方案3】:

    只需将 EOF 替换为 '\n'(换行符)。直到到达新行,您的代码才会读取。这是它的样子:

    #include <stdio.h>
    int main()
    {
      FILE *fr;
      char c = ' ';
      fr = fopen("prog.txt", "r");
      while(c != EOF && c != '\n')
      {
        c = fgetc(fr); /* read from file*/
        if(c != EOF){
              printf("%c",c); /*  display on screen*/
        }
      }
      fclose(fr);
      return 0;
    }
    

    我还没有测试它,但可能工作。如果代码有问题,请告诉我,我将对其进行编辑。

    Edit1:char c;第 5 行初始化为 ' ' 用于处理 UB。

    Edit2:在第 7 行的 while 循环中添加条件 (c != EOF),因为没有给出无限循环的理由。

    Edit3:将 if 语句添加到第 10 行以不打印 EOF,这可能是导致奇怪结果的原因。

    【讨论】:

    • "代码将读取直到到达新行" --> 除非首先出现 EOF。那么这段代码就是一个无限循环。考虑同时检查并使用int c
    • 您需要在打印之前检查 fgetc() 返回的内容,因为尝试打印 EOF 会产生奇怪的结果。
    • @JonathanLeffler 为您提供评论。我编辑了答案。
    猜你喜欢
    • 2016-12-23
    • 2023-03-13
    • 2021-05-26
    • 2012-07-24
    • 2017-03-27
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多