如何从这个文本列表中取第一行?

问题描述 投票:0回答:1

我有一个包含文本的列的列表,但我只是想从这个列表中取第一个上行。如何做到这一点?

#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;
}
c function eof
1个回答
5
投票

你的停止条件是 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() 对于一个可移植的代码。getline() 如果你不是在Windows上或者 下载便携式版本当然,你也可以自己做,比如说 这个这个.


2
投票

不管它的价值是什么,这里有一个使用了 航线

#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() "这样的IO调用的状态是个好主意。

2
投票

只需将EOF替换为'\n'(new line char)。这样你的代码就会一直读到新的行。这就是它的样子。

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

我还没有测试过,但可能会成功. 请让我知道,如果有一些问题的代码,我会编辑它。

编辑1:第5行的char c; 初始化为'',用于处理UB。

Edit2:在第7行的while循环中加入条件(c != EOF),以避免给无限循环一个理由。

Edit3:在第10行中添加if语句,因为不打印EOF,这可能是产生奇怪结果的原因。

© www.soinside.com 2019 - 2024. All rights reserved.