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[i]=fgetc(stdin);です。その入力をファイルからコピーして端末に貼り付けたり、端末でそのプログラムを実行したりしても、< input.txt端末で実行すると、そこに入力を貼り付けて、停止するよりも手動で (^D) を追加EOF します。どこで問題が発生するか教えてください。

4

3 に答える 3

0

最大 100 文字を char line[] に読み込んでいます。'\n'または、または EOF で読み取られた 100 文字で終了します。の仕様ですfgets()

そのため、コード ロジックに一致する 1 つの呼び出し 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 に答える