#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?我的意思是,它实际上是指什么才能知道它到底在哪里?如何检索该内存地址并进行打印?
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库的来源.