如何从此文本列表中获取第一行?

How to take first row from this list of text?

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

#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;
}

你的停止条件是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;
}

这是尊重您阅读 charchar 的代码,您还拥有允许您阅读整行的库函数,例如 fgets() 用于便携式代码,or getline() if you are not on Windows, alternatively download a portable version, and, of course you can make your own like this one or this one.

只需将 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,这可能是导致奇怪结果的原因。

无论如何,这里有一个使用 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() returns 行尾分隔符。如果你不想要它,你可以随时将其剥离。
  • 始终检查 I/O 调用的状态是个好主意,例如 "fopen()"。