用fgets读取输入(进入无限循环)

时间:2013-11-22 14:13:57

标签: c linux fgets

我有这个应用程序,它用fgets读取用户输入。如果我在程序运行时接受用户输入,它工作正常并没有问题。但是,如果我提供一个文件说“./myprog< in.txt”,它将进入无限循环并打印我在用户未在整个屏幕上提供有效输入时显示的自定义错误消息。这就像按下返回键一样。我该如何解决这个问题?

这是我的程序的一部分,它有fgets

while(1){
  mainMenu(&choice);
  switch(choice)
  {
     case 0: 
        return 0;

     case 1: //Add movies 
        getMovieData(&list);
        break;

     case 2:
        ....some initialization... 
        printf("Provide a name to delete : ");
        fgets(inputBuffer,sizeof(inputBuffer),stdin);
    trimWhiteSpace(inputBuffer);
        deleteMovie(&list,inputBuffer);
        break;

     case 3: //List all movies
        printMovieData(list);
        break;

     case 4: //List movies by genre
        inputBuffer[0] = '\0';
        printf(".....");
    fgets(inputBuffer,sizeof(inputBuffer),stdin);               
        trimWhiteSpace(inputBuffer);
        if(!isNum(inputBuffer,&genreChoice)){ 
           showMessage("Number Expected\n");
           break;
        }
        else if(!checkNumberValidity(&genreChoice,1,6)){
           showMessage("Choose from 1 to 7\n");
           break;
        }
        else printMoviesByGenre(list,getGenre(genreChoice-1));
        break;

  }

}

while(1){
  printf("Provide the number of movies you would like to enter: ");
  fgets(temp, sizeof(temp), stdin);
  trimWhiteSpace(temp);         
  if(!isNum(temp,&numMovie)) printf("Enter a numeric value\n");
  else if(!checkNumberValidity(&numMovie,1,MAX_MOVIES)) printf("No greater than %d\n",MAX_MOVIES);  
  else break;

}

2 个答案:

答案 0 :(得分:1)

检查fgets的返回值。失败时返回NULL。在流的末尾,fgets返回NULL,feof(file)将是!= 0,表示您已到达流的末尾(EOF,文件结束)。

正如查理伯恩斯所说,你必须在输入结束时退出,所以做这样的事情:

if (fgets(temp, sizeof(temp), stdin) == NULL)
    exit(EXIT_SUCCESS);

...在while(1)循环中。

相关:fgets and dealing with CTRL+D input

答案 1 :(得分:0)

我不认为无限循环来自fgets。但它没有很好地声明fgets(inputBuffer,sizeof(inputBuffer),stdin);第二个参数必须是一个大小,大小说明你想读多少字符。告诉我们你在无限循环中看到的printf在哪里。