c - Stdin og EOF-adfærd under Windows-konsollen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg lærer, hvordan input fungerer i C. Min største kamp er at forstå EOF-adfærd i terminalen

For det første bruger jeg Windows og GCC compiler 'Hvis dette kan hjælpe'

For det andet, jeg forsøger ikke at omdirigere input fra en fil ... mit spørgsmål handler om input fra Windows-konsollen


Mit spørgsmål:


Jeg læser, at EOF lukker inputstrømmen, som du ikke kan læse fra stdin efter EOF ... Dette er ikke tilfældet for mig! Selv efter at jeg har indtastet udtrykkeligt Enter-Ctrl-Z-Enter, hvis jeg gør en anden getchar () kalder det læses fra stdin ... Et eksempel:



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("
You entered: \%c
",c); //It displays 'a'?!



Der sker også noget mærkeligt, når du skriver ^ Z i midten af ​​snoren, nogen tegn før det ville blive returneret, men noget skrevet efter, at det ikke lykkes! Men når du tjekker for det variable indhold, er det ikke lig med -1? Her er et eksempel:



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("
You entered: \%c
",c); //It also displays 'a'?!




Tro mig, jeg m virkelig forsøger at forstå, hvordan det virker, men det er virkelig forvirrende for en nybegynder i C ... Så enhver hjælp ville være meget værdsat!

Bedste reference


Du bruger Ctrl-Z til at signalere EOF. Dit program opfører sig i overensstemmelse hermed. Men stdin vil forblive åben. Du kan stadig 'lukke' stdin, men kun til dit program. Prøv dette, og se forskellen:


   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("
You entered: \%c
", c);


Du får ikke 'a' længere, du får EOF (-1).








  • EOF er en makrodefinition i stdio.h og er almindeligvis lig med -1

  • For at simulere EOF via terminalindgang, skriv sekvensen: Enter-Cntrl-Z-Enter i Windows-konsollen.

  • Efter EOF-signal forbliver indgangsstrømmen åben ... Hvorfor? Fordi stdin skal være åben altid. (Man kunne bruge fclose(stdin) for at lukke streamen, men det er en dårlig ide, da filhåndtag nemt kan blive ødelagt.)

  • ^ Z er ikke EOF, hvis du kontrollerer, at det er værd at det er s 26 (Ikke -1).

  • Indtastning ^ Z overalt ville spyle stdin efter det ...


Andre referencer 1


Lad mig forklare: Den klassiske brug for denne funktion er læst fra filer. Hver fil slutter med EOF.
Stdin er 'speciel fil', fordi den ikke har EOF. Så hvordan det virker? Hver gang du rammer Enter, har du indtastet den streng, du har indtastet til stdin-bufferen. Hvert kald til getchar () læser single char fra denne buffer. Når du kalder getchar (), og bufferen er tom, venter programmet, at brugeren skriver ny streng og trykker på Enter.
Så da vi fik EOF fra stdin? Dybest set aldrig. MEN brugeren kan simulere EOF efter type Ctrl + Z . Dette kommer ind i EOF char, men det har ingen effekt på ingenting !. I dette tilfælde er det bare en char.