C-读取文件时出现无限循环

时间:2018-07-03 14:55:44

标签: c

我知道这是一个简单的问题,但我不知道该如何解决。我正在学习文件,当我尝试读取文件时,它陷入了无限循环。这是我的代码:

int main()
{

    FILE *p;

    p = fopen("123.txt", "r");

    char ar[150];   

    while(!feof(p))
    { 
        fgets(ar, 150, p); 
        puts(ar);
    }

    fclose(p);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您需要这个:

#include <stdio.h>

int main()
{
  FILE *p = fopen("data.txt11", "r");
  if (p == NULL)
  {
    printf("File could not be opened.\n");
    return 1;
  }

  char ar[150];

  while (fgets(ar, 150, p) != NULL)
  {
    puts(ar);
  }

  fclose(p);
  return 0;
}

答案 1 :(得分:2)

请勿使用feof(),请参阅Why is “while ( !feof (file) )” always wrong?

检查fopen()的返回值是fopen()是成功还是失败,如果fopen()返回NULL,则不要继续进行或不对它进行任何操作p。例如

FILE *p = fopen("data.txt11", "r");
if (p == NULL) {
    fprintf(stderr,"file doesn't exist\n");
    return 0;
}

并检查fgets()的返回值。在fgets()的手册页中

  

返回值          fgets()成功返回s,错误返回NULL或结束返回          未读取任何字符时发生文件丢失。

例如

char *ptr = NULL;
while( (ptr = fgets(ar,sizeof(ar), p)) != NULL) {  
   printf("%s",ptr);
   /* fgets() copies \n t the end of buffer, if you don't want remove it by some logic */ 
}

关于fgets()将在手册页上显示的内容

  

fgets()从流中读取最多one less than size个字符   和          将它们存储到s指向的buffer中。阅读停止后          EOFnewline。如果读取了换行符,则它将stored放入缓冲区。