
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の移行は初めてなのでどうしていいのか分かりません。
どなたか良い解決方法をご存知の方、助けてください。お願いします。
No.2ベストアンサー
- 回答日時:
stdinのバッファリングはsetbuf()で無効化できます。
問題はそっちよりもコンソールプログラム(ターミナルなど)のバッファリングですね。
sttyコマンドでターミナルをrawモードにしてください。
直りました!
setbuf()という関数があったんですね。
sttyコマンドの使い方がよく判らなかったんでman見ながら
"stty raw"とやったんですが"stty"と打ったときの設定は何も変わってませんでした。
一応直ったのでOKです。
ただ、その先のfwriteでsegmentation faultが出てることが判明しました。
これは次回の質問ということで…。
ありがとうございました!
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' ){ /* 終了 */ }
――みたいにするとか。
直りました!
そんな風になって"\n"が残っていたんですね。納得です。
freadで読む方法は何故かうまくいきませんでした(keyin[0]の判定がスルーでした)。
ありりがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語scanf_sで何故か2回入力に...
-
vbaで複数のパターンのファイル...
-
プログラミング python
-
batプログラム上で文字列を入力...
-
入力候補を表示させるには・・・?
-
Userformの入力順序をタブオー...
-
*をユーザーが入力した数字の数...
-
C言語について質問です。 0以下...
-
scanf関数について
-
C言語の勉強しています。すみま...
-
コマンドプロンプトからのEOFの...
-
正負を反転させて出力するプロ...
-
プログラミングの問題です 「金...
-
アセンブラ言語CASLIIのプ...
-
java初心者です。入力されたの...
-
Eclipseでコマンドラインを入力...
-
Eclipseコンソール表示を、リセ...
-
Java 年数計算
-
scanf関数 バッファに残ったエ...
-
入力する数字のサイズ制限について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
EDITコントロールで入力できる...
-
Excel VBAで、Application.Inpu...
-
4桁の数字以外を入力したらエラ...
-
Eclipseコンソール表示を、リセ...
-
入力値が1以下、かつ数字以外の...
-
電卓の小数点
-
コマンドプロンプトからのEOFの...
-
プログラミングの問題です 「金...
-
scanf が無視されます
-
漢字のソートについて
-
scanfが2回使えない・・・?;
-
C言語について
-
Userformの入力順序をタブオー...
-
WindowsでEOF
-
ワードで文字を入力する時の変...
おすすめ情報