• ベストアンサー

ファイルの出力

コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

入力がバッファリングされているために、 改行が入力されるまで、入力が確定しないためではないでしょうか。 <conio.h> getch()または、getche()を使ってみて下さい。 ちなみに fgets(str, 79, fp); if (!feof(fp)) printf("%s",str); の部分は、先のfgetsでファイルが終了した時 次のprintfが実行されないような気がしますが、 それで、いいんでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

getch()を使うときのサンプルです。 #include <conio.h> 追加 char ch; → int ch; に変更  while(fgets(str, 80, fp)!=NULL){   printf("%s",str);   printf("追加しますか?(y/n)");   while(1) {    ch=toupper(getch());    if (ch == 'Y' || ch == 'N') break;   }   if (ch=='N') break;   printf("\n");  }

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4896/10350)
回答No.1

端末からの文字入力は通常は行単位になっています。 getchar()で一文字だけ入力することは端末のモードを変更すれば可能ですが、通常だと改行を押さない限り入力されないし、文字の後に改行文字が続くのでその考慮が必要です。 例えば、ch=getchar(); でなく、while(!isalpha(ch=getchar())); にして英字以外を読み飛ばすようにするなど。 一般的には、fgets(str,79,stdin); とfgetsで行単位で処理するのが普通です。またgetsは、入力エリアのサイズを指定することが出来ないので使ってはいけない関数です(過去からの互換性のために残されている)。代わりにfgetsを使ってください。

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • アンドロイドのスマホとブラザー製のDCP-J525Nプリンターを同じ無線LANに接続しているにも関わらず、スマホからの印刷ができません。通信エラーが発生しています。
  • 問題の製品はブラザー製のDCP-J525Nプリンターです。アンドロイドのスマホと同じ無線LANに接続していますが、印刷ができません。通信エラーが表示されます。
  • スマホからDCP-J525Nプリンターへの印刷ができません。スマホとプリンターは同じ無線LANに接続していますが、通信エラーが発生しています。
回答を見る

専門家に質問してみよう