アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の移行は初めてなのでどうしていいのか分かりません。
どなたか良い解決方法をご存知の方、助けてください。お願いします。

A 回答 (2件)

stdinのバッファリングはsetbuf()で無効化できます。


問題はそっちよりもコンソールプログラム(ターミナルなど)のバッファリングですね。
sttyコマンドでターミナルをrawモードにしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/05 12:43

> 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' ){ /* 終了 */ }
――みたいにするとか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/05 12:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!