I was tasked with creating a test program in C
that reads the contents of the standard input and then prints them.
But I have a little doubt: what is exactly standard input?
Is it what I type in the keyboard? Is it a file I have to read?
Both of them?
And the same goes for standard output
: is it the console? a file?
The C standard (e.g. C99 or C11) defines what should be expected from the standard <stdio.h>
header (after having suitably #include
-d it). See stdio(3) man page.
Then you have the stdin
and stdout
and stderr
file handles (pointers to some FILE
which is an abstract data type).
The fact that stdin
is related to some device (e.g. a keyboard) is implementation specific.
You could implement the C standard by paying someone to be your stdin
instead of using a computer, but that would just be inefficient. Often, computers gives you some implementation of the C standard thru the help of some operating system.
You may want to know, inside your C program, if stdin
is a "keyboard" or redirected from some "file". Unfortunately, AFAIK, there is no C99-standard way to know that.
As you mention, stdin
, stdout
and stderr
should be available in your program at startup (i.e. after entering main
....). Hence, unless you fclose
the stdin
stream, you can read it (with getchar
, scanf
, getline
, fgets
, fscanf
... and friends) without any prior care (so you don't need to fopen
it yourself).
On Linux or most Posix systems, you might use as an approximation isatty(STDIN_FILENO)
- see isatty(3) for more - to test if stdin
"is" the "keyboard" (by testing if it is some tty). See also this & that.