fgetc()如何知道下一个字符的地址?如何检索当前的字符地址?

nei*_*eap 1 c

#include <stdio.h>

int main()
{
    FILE *fp;
    char ch;

    fp=fopen("file1.txt","r");

    while(feof(fp))
    {
        ch=fgetc(fp);
        printf("%c",ch);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何fgetc()知道要打印的字符读取(因为fp在整个程序中保持相同,不会增加); 同样如何识别EOF?我的意思是,它实际上是指什么才能知道它到底在哪里?如何检索该内存地址并进行打印?

Pur*_*rag 6

A FILE *实际上不是指向文件的指针,您可以递增和递减读取; 相反,它是一个指向struct FILE对象的指针.不同的库对结构有不同的定义,但实质上,结构中有一些字段会在内部跟踪文件的当前位置.

这是一个示例实现fgetc(从这里复制):

int
fgetc(FILE *fp)
{
    int cnt;
    unsigned char c;

    if (fp->ungetcflag) {
        fp->ungetcflag = 0;
        return fp->ungetchar;
    }
    cnt = read(fp->fd, &c, 1);
    if (cnt <= 0)
        return EOF;
    return c;
}
Run Code Online (Sandbox Code Playgroud)

fgetc只是在内部调用read以获取下一个字符.你可以继续沿着兔子洞继续下去,最终找出struct FILE内部状态发生变化的地方,以反映取得一个新角色.

有关您的版本的更多详细信息fgetc,您必须查看机器的C库的来源.