• ベストアンサー

ファイルの出力

コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #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% (4900/10359)
回答No.1

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

関連するQ&A

専門家に質問してみよう