Issue
I have been given a task to write a program that will take keyboard input (excluding space) and print to a .txt file without using an array.
I tried to use a while loop to do this but was getting an infinite loop, I then came on to stack overflow and found a solution within a different problem, EUREKA!
Adding:
&& ch != EOF
solved my problem.
However, I do not fully understand why the solution works and would like help to understand why this second condition was needed.
while((ch=getchar()) != '\n' && ch != EOF)
{
putc(ch, fin);
}
fclose(fin);
return 0;
Thank you.
Solution
Because the return value of getchar is the character read on success, and
EOF on error or when the end-of-file has been reached:
man getchar
RETURN VALUE
fgetc(),getc()andgetchar()return the character read as anunsigned charcast to anintorEOFon end of file or error.
There are several reasons as to why stdin might reach end-of-file:
- The user pressed Ctrl+D (on Unix/Linux) which causes
stdinto close stdinwas connected to a pipe ($ cat file.txt | ./myprogram) and the pipe closed becausecatended.stdinwas connected to a redirection ($ ./myprogram < file.txt) and it reached the end offile.txt
On all this cases, getchar will eventually return EOF and you cannot keep
reading. If you do
while((ch=getchar()) != '\n')
{
...
}
and stdin closes, then you end up in an endless loop, als EOF != '\n' always
evaluates to true. So in order to protect yourself from that, you have to check
if the read operation failed. And you do that by checking whether the reading
function returned EOF. That's why
int ch;
while((ch=getchar()) != '\n' && ch != EOF)
{
...
}
is the correct way of looping with getchar. Also note that ch must be of
type int.
Note also that this applies for all FILE buffers (opened in read mode),
not only to stdin.
Answered By - Pablo Answer Checked By - Gilberto Lyons (PHPFixing Admin)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.