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

时间:2016-07-30 23:41:02

标签: 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;
}

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

2 个答案:

答案 0 :(得分:6)

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

以下是fgetc的示例实现(从here转载):

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;
}

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

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

答案 1 :(得分:3)

FILE [很可能]一个包含有关已打开(带fopen())文件的信息的数据结构。其中一个结构成员是当前文件位置(或偏移量)[实现定义,但我们假设是这种情况]。

每当您读取或写入fp指向的文件时,此结构成员都会递增。 fseek()可用于设置文件位置。 ftell()将返回当前文件位置,在这种情况下,这是您正在寻找的位置。

fp [内存地址]的值不变,因为正如我所说,它是数据结构的指针 [再次,实现定义,但这可能是对于在调用fopen()时分配的每个实现都是true,并且在调用fclose()时将释放。结构成员值有什么变化。