• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WindowsでEOF)

WindowsでEOF

このQ&Aのポイント
  • 現在、WindowsでVC++2010Expressを使用してコードを書いています。
  • Ctrl+Z(またはCtrl+D)を押してもプログラムが停止しない問題が発生しています。
  • 質問:Ctrl+Z(またはCtrl+D)を押しても、プログラムが停止しない問題の解決方法が知りたいです。

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

  • ベストアンサー
回答No.7

>私もそれが気になって「BackSpace」や「Delete」も試してみましたが、カウントされずに表示通りの文字数が返って来ました。 >この辺の動作が不明なのですが、「getchar()がEOF以外の値を返却した回数のカウントとなっているハズ」ではないのでしょうか? 標準入力は、通常では「バッファリング」されているので、改行がストリームを通過しないとプログラムに制御が戻りません。 「A」「B」「C」「バックスペース」「バックスペース」「^Z」「^Z」「1」「2」「3」と押しても、プログラムに返ってきません。 最後に「Enter」を押した瞬間、バッファ内の文字が整理されてから、プログラムに返って来ます。 上記の場合では、バッファ内が「A」「^Z」「^Z」「1」「2」「3」「\n」に整理されてから、プログラムに制御が戻ります。 「B」「C」「バックスペース2個」は、バッファが整理された時に削除されてしまいます。 すると、最初のgetcharには「A」が返されます。 その「A」は「EOFではない」ので、ループを繰り返します。 次にあるのは「^Z」ですが、これは「テキストモードでのファイルの終わり」なので、getcharは「ストリームが尽きた」と処理して「EOF」を返します。 この「EOF」は、通常は「文字コードに無い値」に定義されています(通常は「-1」になっている筈) 文字コードは「0~255」の筈ですから、どんな文字を入れても「-1」とは一致しません。 getcharが「EOF」を返したので、貴方のプログラムはループを終了してしまいます。 結果、上記のように入力すると、結果は「1」になるでしょう。 これは、プログラムを以下のようにすると「実感」出来ます。 #include <stdio.h> int main() { int strText; int counter=0; while( (strText=getchar() ) != EOF){ ++counter; printf("L:%d\n",counter); } printf("E:%d\n",counter); return 0; } プログラムが起動したら ABC「Enter」DEF「Enter」123ABC「BS」「BS」「^Z」「Enter」と入力してみましょう。 結果は ABC L:1 L:2 L:3 L:4 DEF L:5 L:6 L:7 L:8 123A^Z L:9 L:10 L:11 L:12 E:12 となる筈です。 「Enter」を押さない限りはプログラムに戻って来ないので、「A」「B」「C」を入力した段階では、ループの中にある printf("L:%d\n",counter); は実行されません。 そして「Enter」を押した瞬間、それまでの間にバッファに溜まった文字が「改行も1文字」としてgetcharから返って来ます。 なので「Enter」を入力した瞬間、「A」「B」「C」「\n」が順に連続で返って来て、ループ内の表示が4回連続で一気に行われます。

codingbeginner
質問者

お礼

わざわざ懇切丁寧に解説して頂いてありがとうございます!すごくわかりやすかったです。 ところで、ご示し頂いたコードをそのまま試してみたのですが、 不思議なことに、 (前略) 123A^Z L:9 L:10 L:11 L:12 L:13 となり、もう一度「^Z」「Enter」を押さねば「E:13」という出力が現れません。 これは一体どういうことなんでしょうか??

すると、全ての回答が全文表示されます。

その他の回答 (13)

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.3

>ところで、(仕様にもよるでしょうが)何も言われていない場合であれば通常キャラクタのカウントにはスペースやタブ、改行は含めるのでしょうか? スペースとタブは数え、改行は数えませんね。 タブはデータ上は1文字ですが、見た目には4文字や8文字になるので 4や8とカウントすることもあります。 要は画面や印刷で数えたものと一致させることですね。

codingbeginner
質問者

お礼

ありがとうございます。改行は数えないように修正しました。

すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.2

訂正 誤)Windows+vc2013で動かしてみました。 正)Windows+vs2013で動かしてみました。

すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

Windows+vc2013で動かしてみました。 Ctrl+Zをおすと^Zと表示されて、その後enterを押すと終了しました。 ちなみに putchar(counter);  ではなくて、 printf("%d\n",counter);  にしましょう。 それに(仕様によりますが)enterも数えています。

codingbeginner
質問者

補足

VS2013とVS2010でこの辺のことが違うということはないと思うのですが。 あれから、特に何もコードをいじること無しに動くようになりました。Linkが見つからないとエラーが出ていたので、そこのフォルダから一度開き直したからかもしれません。 printfは先にそれで試してならなかったのでputcharを書いておりました。正常にコンパイルされてからはputcharではエラーが出るので書き換えました。 ところで、(仕様にもよるでしょうが)何も言われていない場合であれば通常キャラクタのカウントにはスペースやタブ、改行は含めるのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A