#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
?我的意思是,它实际上是指什么才能知道它到底在哪里?
如何检索该内存地址并将其打印出来?
答案 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()
时将释放。结构成员值有什么变化。