0

我使用以下循环读取输入

do
{
      i=0;
      do
      {
          line[i]=fgetc(stdin);
          i++;

      }while(i<100 && line[i-1]!='\n' && line[i-1]!=EOF);

      //Parsing input

 }while(line[i-1]!=EOF);

我的输入看起来像这样

$GPRMC,123519,A,4510.000,N,01410.000,E,010.0,010.0,120113,003.1,W*4B
$GPRMC,123520,A,4520.000,N,01650.000,E,010.0,010.0,230394,003.1,W*4B
$GPRMC,123521,A,4700.000,N,01530.000,E,010.0,010.0,230394,003.1,W*4F
$GPRMB,A,0.66,L,001,002,4800.24,N,01630.00,E,002.3,052.5,001.0,V*1D
$GPGGA,123523,5000.000,N,01630.000,E,1,08,0.9,100.0,M,46.9,M,,*68

所以我的问题是,在最后一行之后,当它应该读取 EOF 时,它停止在 line 上line[i]=fgetc(stdin);。即使我从文件复制该输入并将其粘贴到终端,或者即使我在终端中运行该程序< input.txt。但是当我在终端中运行它时,将输入粘贴到那里,然后手动添加EOF (^D)而不是停止..有人可以吗告诉我哪里有问题?

4

3 回答 3

0

将 do-while 替换为 just while 并尝试。找到 EOF 后将检查条件,我的意思是,即使在 EOF 之后,您正在执行不正确的 fgetc(stdin)

于 2013-04-18T11:43:59.850 回答
0
#include <stdio.h>

int main(int argc, char *argv[]){
    char line[100+1];
    int ch;

    do{
        int i=0;
        while(EOF!=(ch=fgetc(stdin)) && ch !='\n' && i<100){
            line[i++]=ch;
        }
        line[i]='\0';
        if(*line){
            //Parsing input
            printf("<%s>\n", line);
        }
    }while(ch != EOF);

    return 0;
}
于 2013-04-18T12:10:02.973 回答
0

您正在将最多 100 个字符读入 char line[]。'\n'您以在 or或 EOF中读取的 100 个字符终止;这是 的规范fgets()

因此,请考虑使用与您的代码逻辑相匹配的一次调用 fgets()。,fgets等于:

while(fgets(line, 100, stdin)!=NULL )  // get up to \n or 100 chars, NULL return means usually EOF
{
   char *p=strchr(line, '\n');
   if(p!=NULL) *p=0x0;

   // parsing input
}
// here you should also check for NULL caused by system errors and not EOF -- maybe using feof(stdin)
于 2013-04-18T12:13:36.280 回答