• 締切済み

C言語におけるfgetsを用いたループ処理について

C言語において、文章を読み込むためにfgetsを用いて下記のプログラムを書いたのですが、*において入力を受け付けなくなります。 これを解消する方法はないでしょうか? ちなみにコンパイラはBBC、開発環境はVistaです。 なお、簡略のため#include,main等は省略しています。 //以下プログラム #define SIZE 16384 char moji[SIZE] = {""}; char buf[SIZE]; //EOF(^Z)になるまで、文字列を受け取る while(fgets(buf, sizeof(buf), stdin) != NULL){ if(sizeof(moji) < strlen(moji) + strlen(buf)) break; strcat(moji, buf); }; getchar(); //* //プログラムここまで

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★入力は受け付けています。 >*において入力を受け付けなくなります。  ↑  思い違いです。  入力ファイルが 16384 バイト以上だと while 文を抜けます。  でもバッファには残りのテキストが存在します。  このテキストを getchar() は受け取ってしまうために  『入力を受け付けない』ように見えるだけです。 ・解決策は while 文の後にバッファをフラッシュする処理を記述します。  下のサンプルをどうぞ。 サンプル: while ( … ){  ここで入力と break の処理 } // バッファのフラッシュ while ( getchar() != EOF ){  ; } // ここで一時停止 getchar(); ↑ これなら入力を受け付けるようになります。

vtr9
質問者

お礼

下記のように少し改変してみましたが、依然入力を受け付けないままです。 fgets以外の場合(getsなど)は、正常に入力することができるのですが、可能ならば使用は避けたいところです。 while(fgets(buf, sizeof(buf), stdin) != NULL){ if(sizeof(moji) < strlen(moji) + strlen(buf)) break; strcat(moji, buf); }; while ( getchar() != EOF ){;}   getchar();

vtr9
質問者

補足

補足欄ですいません。 どうも予想外のことが起きたので質問のソースに追加します。 下記でfgetsを使って入力した後についてですが、*2のgetcharを無視して、*1のscanfで入力を受け付けなくなります。 *2のgetscharについては、その個数を増やしても同様に無視されるようです。 void main(void){  int mode,r;  while(1){   do{    r = scanf("%d", &mode); //*1 1度目は「1」を入力    while(getchar() != '\n'){ };   }while(r == 0)   switch(mode){ //その他選択肢あり    case 1:     execute();     break;   }  }  return; } void execute(void){  while(fgets(~~) != NULL){   //先ほどの処理  }  while(getchar() != EOF){}  getchar(); //*2 これを無視して動作  return; }

関連するQ&A