Reputation: 176
I'm learning how input works in C. My biggest struggle is understanding EOF behaviour in the terminal
First, i'm using Windows and GCC compiler "In case this might help"
Second, i'm not trying to redirect input from a file... my question is about input from Windows console
My question:
I read that EOF closes the input stream, that you can't read from stdin after EOF... This is not the case for me! Even after i enter explicitly Enter-Ctrl-Z-Enter, if i do another getchar() call it reads from stdin... An example:
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'?!
Also, something strange happens when you type ^Z in the middle of string, any chars before it would be returned but anything typed after it disapprears! But when you check for the variable content it's not equal to -1? Here's an example:
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'?!
Believe me i'm really trying to understand how this works but it's really confusing for a beginner in C... So any help would be greatly appreciated!
Upvotes: 3
Views: 889
Reputation: 801
You use Ctrl-Z to signal EOF. Your program behaves accordingly. But stdin will remain open. You can still 'close' stdin, but for your program only. Try this, and see the difference:
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);
You will not get 'a' anymore, you will get EOF (-1).
Edit:
fclose(stdin)
to close the stream, but that is a bad idea, since file handles can easily get messed up.)Upvotes: 1
Reputation: 23
Let me explain: the classic usage for this function is reads from files. Each file ends with EOF. stdin is "special file", because it doesn't have EOF. So how it works? Each time you hit Enter, the string you have typed inserted to the stdin buffer. Each call to getchar() reads single char from this buffer. When you call getchar() and the buffer is empty, the program waits the user to type new string, and hit the Enter. So, when we got EOF from stdin? Basically, never. BUT the user can simulate EOF by type Ctrl+Z. This will enter EOF char, but it have no effect on nothing!. In this case, it is just a char.
Upvotes: 1