为什么这个条件没有捕获 EOF?我得到分段错误 [重复]

Why this while condition doesn't catch EOF? and i get segmentation fault [duplicate]

提问人:Zi Elad 提问时间:8/3/2019 更新时间:8/3/2019 访问量:128

问:

所以问题是,我尝试使用 fgets 从文本中读取一行并将其打印出来,但它效果不佳,它完美地读取所有文件直到最后,但它读取最后一行两次,而不是“喊”出错。

void somefun(FILE *file){
char *buf[81];

    while(!feof(file)){
        if(fgets(buf,80,file)){
        continue;}
       printf("%s,buf); }

void main() {
FILE *fp;
fp=fopen("somefile.txt","r+");
somefun(fp); }
C 分割-故障 fgets eof feof

评论

0赞 Dmitri 8/3/2019
用于检查读取是否因 EOF 而失败,而不是查看是否还有更多剩余数据。它表示您是否尝试过终点,而不是您是否在终点。feof()
1赞 Dmitri 8/3/2019
另外,您已声明为 81 的数组,而不是 81 的数组。而且你缺少一个引号。bufchar *char
1赞 Peter 8/3/2019
当遇到文件末尾时,其内容是不确定的,因此打印它会导致未定义的行为。更改循环条件,使其基于 的返回值(仅当不指示错误时打印)并放弃 的用法。并返回 ,而不是 。fgets()buffgets()fgets()feof()main()intvoid
0赞 WhozCraig 8/3/2019
这个函数的逻辑很奇怪。除了不恰当地使用 作为条件,并假设您实际上修复了 的类型之外,您似乎故意想要忽略通过该测试条件和后续条件成功读取的所有行 那么,您实际上希望这段代码做什么?如果意图是像你说的那样“读行”,甚至根本不需要循环!feofbufifcontinue
0赞 Sir Jo Black 8/3/2019
尝试:while(fgets(buf,80,file)) printf("%s",buf);

答:

0赞 alk 8/3/2019 #1

完全没有必要使用。feof()

它可能看起来像这样:

#include <stdio.h>

void somefun(FILE* file) {
  char buf[80]; 

  while (NULL != fgets(buf, 80, file)) {
    printf("%s", buf);
  }

  if (ferror(file)) {
    fprintf(stderr, "fgets() failed\n");
  }
}

int main(void) {
  FILE *fp = fopen("somefile.txt", "r+");
  if (NULL == fp) {
    fprintf(stderr, "fopen() failed\n");
  }
  else {
    somefun(fp); 
  }
}