2017-01-21 14 views
3

入力がCでどのように動作するかを学習しています。私の最大の苦労は、端末のEOF動作を理解することです。
まず、WindowsとGCCコンパイラを使用しています。 第二には、私はファイルから入力をリダイレクトしようとしていないよ...私の質問は、Windowsコンソールからの入力についてです私の質問

:私はEOFは、入力ストリームを閉じていることを読んで

、ことをあなたがすることはできませんEOFの後にstdinから読む...これは私の場合ではありません!あなたは^ Zを入力する際に​​も、奇妙な何かが
WindowsコンソールでのStdinとEOFの動作

int c = 0; 
char str[100]={0}; 

printf("Type in a string with spaces so some chars would remain in Stdin: "); 
//Let's say i type "Hello world!" 
scanf("%s",str); 

while((c=getchar()) != EOF) 
    printf("%c",c); 
//it displays " World!" in console, then i type Enter-^Z-Enter 
//The loop exits so far so good 

printf("Let's just check if we can still read from stdin, type a char: "); 
c = getchar(); //i type the letter 'a' 
printf("\nYou entered: %c\n",c); //It displays 'a'?! 


起こる:私は明示的に入力し、Ctrl-Zを入力し、私は別getchar関数を()の例...それは標準入力から読み込みを呼び出すない場合は入力した後でも文字列の真ん中では、返される前の任意の文字が返されますが、それが返された後には何も入力されません!しかし、可変内容をチェックすると、-1と等しくないのですか?ここでは例です:

int c = 0; 
char str[100]={0}; 

printf("Type in a string with spaces so some chars would remain in Stdin: "); 
//This time i type "Hello wor^Zld!" with ^Z in the middle of "World!" 
scanf("%s",str);  

while((c=getchar()) != EOF) 
    printf("%c",c); 
//it displays " Wor->" in console, with the cursor hanging waiting for input 
/* 
So on the one hand, after ^Z everything disappears, but on the other 
hand it's waiting for input so it's not EOF?! 
*/ 

//In case you're wondering, here too i can call getchar() and read from stdin! 
printf("Let's just check if we can still read from stdin, type a char: "); 
c = getchar(); //i type the letter 'a' 
printf("\nYou entered: %c\n",c); //It also displays 'a'?! 


だから任意の助けをいただければ幸いです...私は本当にこの仕組みを理解しようとしているが、それは本当にCで初心者のために混乱しています私を信じて!

+1

はhttps://msdn.microsoft.com/sv-se/library/xssktc6eを参照してください。aspx about eof –

答えて

1

Ctrl-Zを使用してEOFを通知します。プログラムはそれに応じて動作します。しかし、スタンダードは開いたままです。 stdinを 'close'することはできますが、プログラムのためだけです。これを試してみて、その差を参照してください。

while ((c = getchar()) != EOF) 
     printf("%c", c); 
    fclose(stdin); // <---------- 
    printf("Let's just check if we can still read from stdin, type a char: "); 
    c = getchar(); 
    printf("\nYou entered: %c\n", c); 

あなたが得ることはありません「」もう、あなたは、EOF(-1)を取得します。


編集:

  • EOFはstdio.hでマクロ定義され、そして配列を入力し、入力端子を介して、EOFをシミュレートするために-1
  • 一般等しい:-CNTRLを入力してください-Z Windowsコンソールに入力します。
  • EOF信号の後、入力ストリームは開いたままです...なぜですか? stdinはいつも開いているはずだから。 (1つはfclose(stdin)を使用してストリームを閉じることができますが、それは悪い考えです。ファイルハンドルが簡単に乱れる可能性があります)。
  • ^ZはEOFではありません。
  • 型付け^ Zは、どこでも、その後、標準入力をフラッシュだろう...
+1

返信いただきありがとうございます。私はfclose()を認識していますが、EOFという用語は「End Of File」が働いたはずです。これは、Linux上のいくつかの人々のために、この[質問](http://stackoverflow.com/questions/288062/is-close-fclose-on-stdin-guaranteed-to-be-correct)fclose(stdin )は悪い考えです – user7427260

+1

確かです。私はあなたがそれがどのように動作するのか理解したいと思った。 :)また、pls信号の動作を確認します。^Zと入力すると、EOFは*通知されます*。 – Laszlo

+0

EOFが通知されたら、次に何が起こるのでしょうか?私が最初のコメントで言ったように、この言葉が暗示し、この[質問](http://stackoverflow.com/questions/1622092/problem-with-eof-in-c)への答えによれば、入力読み取り... – user7427260

1

私に説明しましょう:この関数の古典的な使用法は、ファイルからの読み取りです。各ファイルはEOFで終わります。 stdinはEOFを持たないため、「特殊ファイル」です。それはどうやって動くの? Enterキーを押すたびに、入力した文字列がstdinバッファに挿入されます。 getchar()を呼び出すたびに、このバッファから単一のcharが読み込まれます。 getchar()を呼び出すとバッファが空になると、プログラムは新しい文字列を入力してEnterキーを押すのを待ちます。 だから、EOFを標準から取得したときは?基本的に、決して。しかし、ユーザーはタイプ別にCtrl + ZでEOFをシミュレートできます。これはEOF charを入力しますが、何も影響を与えません!この場合、単なるcharです。

+1

EOFは文字ではありません、それはマクロです。詳細については、[link](http://stackoverflow.com/questions/12389518/representing-eof-in-c-code) – user7427260

+0

を参照してください。答えは私の質問ではありません。あなたが何かを理解していない場合は、もう一度質問を行ってください。(BTW、返事ありがとう:)) – user7427260

+0

私はこの答えを正確に説明しています。コンソールで特別なこと。 – linuxfan

関連する問題