首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解fgetc程序

了解fgetc程序
EN

Stack Overflow用户
提问于 2013-07-15 16:17:52
回答 8查看 433关注 0票数 1

我正在读一本关于c编程的书,看不懂下面的例子。或者更准确地说,我不明白为什么它会工作,因为我认为它不应该这样做。

代码很简单,它读取文本文件的内容并将其输出到输出区域。据我所知,我认为

代码语言:javascript
复制
 ch = fgetc(stream);

应该在while循环中,因为它一次只读取一个int?并且需要在当前int被输出之后读取下一个int。好吧,事实证明这段代码确实运行得很好,所以我希望有人能向我解释我的谬误。谢谢!

代码语言:javascript
复制
#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);
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-07-15 16:25:13

我认为你被feof()搞糊涂了:

文档:int feof ( FILE * stream );

检查是否设置了与流关联的文件结束指示符,如果设置了,则返回一个不同于零的值。

指示符通常由试图在文件末尾或文件末尾之后读取的流上的先前操作来设置。

代码语言:javascript
复制
   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   

一种更好的方法是编写循环,如下所示:

代码语言:javascript
复制
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)。

票数 2
EN

Stack Overflow用户

发布于 2013-07-15 16:22:27

如果删除while外部的fgetc,如下所示:

代码语言:javascript
复制
while (!feof(stream)) {
    putchar(ch);
    ch = fgetc(stream);
}

第一次调用putchar(ch)时,ch将被取消初始化。

顺便说一句,不要使用gets,因为它可能导致缓冲区溢出。请改用fgetsgets_s。在C11中删除了gets

票数 2
EN

Stack Overflow用户

发布于 2013-07-15 16:29:38

您提供的代码在While循环之前有'ch =fgetc(stream);‘,在循环体中也有'ch = fgetc(stream);’。按照您正确的说明,循环内的语句从流中一次检索一个ch,这将是合乎逻辑的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17649629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档