I have just recently started working with I/O
in C
. Here is my question -
I have a file, from which I read my input. Then I use fgets()
to get strings in a buffer which I utilise in some way. Now, what happens if the input is too short for the buffer i.e. if the first read by fgets()
reaches EOF
. Should fgets()
return NULL
(as I have read in fgets()
documentation)? It seems that it doesn't and I get my input properly. Besides even my feof(input)
does not say that we have reached EOF
.
Here is my code snippet.
char buf[BUFSIZ];
FILE *input,
*output;
input = fopen(argv[--argc], "r");
output = fopen(argv[--argc], "w");
/**
* If either of the input or output were unable to be opened
* we exit
*/
if (input == NULL) {
fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 1]);
exit(EXIT_FAILURE);
}
if (output == NULL) {
fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 0]);
exit(EXIT_FAILURE);
}
if (fgets(buf, sizeof(buf), input) != NULL) {
....
}
/**
* After the fgets() condition exits it is because, either -
* 1) The EOF was reached.
* 2) There is a read error.
*/
if (feof(input)) {
fprintf(stdout, "Reached EOF.\n");
}
else if (ferror(input)) {
fprintf(stdout, "Error while reading the file.\n");
}
The documentation for
fgets()
does not say what you think it does:From my manpage
And later
I don't read that as saying an
EOF
will be treated as an error condition and returnNULL
. Indeed it says aNULL
would only occur whereEOF
occurs when no characters have been read.The POSIX standard (which defers to the less accessible C standard) is here: http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html and states:
This clearly indicates it's only going to return a
NULL
if it's actually atEOF
when called, i.e. if any bytes are read, it won't returnNULL
.