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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
scanfが2回使えない・・・?;
-
Linuxで入力待ちなしkeyread関...
-
if文の条件にscanf関数を使うと…?
-
scanf が無視されます
-
scanf関数 バッファに残ったエ...
-
java初心者です。入力されたの...
-
scanf("%s", buf);でスペースを...
-
Eclipseコンソール表示を、リセ...
-
double型が正常に認識されてい...
-
入力エラーの処理について。
-
【C言語】入力された文字種別ご...
-
少数部の判定
-
fgetsとループ処理
-
C言語scanf_sで何故か2回入力に...
-
Userformの入力順序をタブオー...
-
enterでループ終了
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報