我正在读一本关于c编程的书,看不懂下面的例子。或者更准确地说,我不明白为什么它会工作,因为我认为它不应该这样做。
代码很简单,它读取文本文件的内容并将其输出到输出区域。据我所知,我认为
ch = fgetc(stream);应该在while循环中,因为它一次只读取一个int?并且需要在当前int被输出之后读取下一个int。好吧,事实证明这段代码确实运行得很好,所以我希望有人能向我解释我的谬误。谢谢!
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE *stream;
char filename[67];
int ch;
printf("Please enter the filename?\n");
gets(filename);
if((stream = fopen(filename, "r")) == NULL) {
printf("Error opening the file\n");
exit(1);
}
ch = fgetc(stream);
while (!feof(stream)) {
putchar(ch);
ch = fgetc(stream);
}
fclose(stream);
}发布于 2013-07-15 16:25:13
我认为你被feof()搞糊涂了:
文档:int feof ( FILE * stream );
检查是否设置了与流关联的文件结束指示符,如果设置了,则返回一个不同于零的值。
该指示符通常由试图在文件末尾或文件末尾之后读取的流上的先前操作来设置。
ch = fgetc(stream); <---"Read current symbol from file"
while (!feof(stream)) { <---"Check EOF read/returned by last fgetc() call"
putchar(ch); <---"Output lasts read symbol, that was not EOF"
ch = fgetc(stream); <---"Read next symbols from file"
}
<-- control reach here when EOF found 一种更好的方法是编写循环,如下所示:
while((ch = fgetc(stream))!= EOF){ <--" Read while EOF not found"
putchar(ch); <-- "inside loop print a symbol that is not EOF"
}另外,注意:int fgetc ( FILE * stream );
返回当前由指定流的内部文件位置指示符所指向的字符。然后,将内部文件位置指示符前进到下一个字符。
如果调用时流位于文件末尾,则函数返回EOF并设置流的文件结束指示符(feof)。
如果读取错误发生,则函数返回EOF并设置流的错误指示符(Ferror)。
发布于 2013-07-15 16:22:27
如果删除while外部的fgetc,如下所示:
while (!feof(stream)) {
putchar(ch);
ch = fgetc(stream);
}第一次调用putchar(ch)时,ch将被取消初始化。
顺便说一句,不要使用gets,因为它可能导致缓冲区溢出。请改用fgets或gets_s。在C11中删除了gets。
发布于 2013-07-15 16:29:38
您提供的代码在While循环之前有'ch =fgetc(stream);‘,在循环体中也有'ch = fgetc(stream);’。按照您正确的说明,循环内的语句从流中一次检索一个ch,这将是合乎逻辑的。
https://stackoverflow.com/questions/17649629
复制相似问题