• ベストアンサー

<conio.h>getche() → <curse.h>getc() = segmentation fault

WindowsのVC++からUNIXのgccに移行している最中です。 VC++では下記のようにgetche()を使っていたんですが printf("Enter more data (Y/N) => "); ch = toupper(getche()); index++; if(ch != 'Y') repeat = FALSE; UNIXではconio.hとgetche()がないとのことで cursh.hとgetc()を使うことにしました。 printf("Enter more data (Y/N) => "); ch = toupper(getc(stdin)); putchar(ch); index++; if(ch != 'Y') repeat = FALSE; } if((file_ptr = fopen("C:FLIGHTS.DTA","w")) == NULL) { printf("Can't open filights file."); exit(0); } fwrite(flights_array, sizeof(flights_array), index, file_ptr); fclose(file_ptr); 最初の入力は良いのですが'y'と打ってからの入力が 一つ飛ばされてしまいます。 (まるでscanfでfflush(stdin)を付け忘れたかのように) Flight ID => NW123 Preminum Capacity => 12 Available Preminum Seats => 12 Economy Capacity => 120 Available Economy Seats => 120 Enter more data (Y/N) => y Y Flight ID => Preminum Capacity => 6 //←Flight IDの入力が飛ばされてます… Available Preminum Seats => 6 Economy Capacity => 45 Available Economy Seats => 45 Enter more data (Y/N) => n Segmentation fault そして挙句の果てにSegmentation faultが出て止まってしまいます。 VC++ → gccの移行は初めてなのでどうしていいのか分かりません。 どなたか良い解決方法をご存知の方、助けてください。お願いします。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

stdinのバッファリングはsetbuf()で無効化できます。 問題はそっちよりもコンソールプログラム(ターミナルなど)のバッファリングですね。 sttyコマンドでターミナルをrawモードにしてください。

sucker
質問者

お礼

直りました! setbuf()という関数があったんですね。 sttyコマンドの使い方がよく判らなかったんでman見ながら "stty raw"とやったんですが"stty"と打ったときの設定は何も変わってませんでした。 一応直ったのでOKです。 ただ、その先のfwriteでsegmentation faultが出てることが判明しました。 これは次回の質問ということで…。 ありがとうございました!

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> ch = toupper(getc(stdin)); stdinはバッファリング動作してます。改行が入力されるまで処理をブロックします。ので、 1)入力として、Y[リターンキー]。 2)stdinに"Y¥n"がバッファされる。 3)getcで1文字取り出し→stdinに"¥n"が残る。 4)次ループの1行入力(getsとかscanfとか)で即座に"¥n"が取り出される。 ――で、あたかも処理がスキップされたように見えてるのでは。 char keyin[ 2 ]; if ( !fread( keyin, sizeof keyin, sizeof *keyin, stdin ) ){ /* EOFかエラー */ } if ( toupper( keyin[0] ) != 'Y' ){ /* 終了 */ } ――みたいにするとか。

sucker
質問者

お礼

直りました! そんな風になって"\n"が残っていたんですね。納得です。 freadで読む方法は何故かうまくいきませんでした(keyin[0]の判定がスルーでした)。 ありりがとうございました!

関連するQ&A