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,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"); }
解决方法
从我的联机帮助页@H_502_9@
fgets()
reads in at most one less thansize
characters from stream and stores them into the buffer pointed to bys
. Reading
stops after anEOF
or a newline. If a newline is read,it is stored into the buffer. A terminating null byte (‘\0
‘) is stored
after the last character in the buffer.@H_502_9@
然后@H_502_9@
gets()
andfgets()
returns
on success,andNULL
on error or when end of file occurs while no characters have been read.@H_502_9@
我没有读到,因为说EOF将被视为错误条件并返回NULL.实际上它说只有在没有读取字符时发生EOF的情况下才会出现NULL.@H_502_9@
POSIX标准(遵循不太容易访问的C标准)在这里:http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html并声明:@H_502_9@
Upon successful completion,
fgets()
shall returns
. If the stream is at end-of-file,the end-of-file indicator for the stream shall be set andfgets()
shall return a null pointer. If a read error occurs,the error indicator for the stream shall be set,fgets()
shall return a null pointer,and shall seterrno
to indicate the error. @H_502_9@
这清楚地表明,如果在调用时它实际上处于EOF状态,它将仅返回NULL,即如果读取任何字节,则不会返回NULL.@H_502_9@