【发布时间】:2015-08-21 14:43:22
【问题描述】:
在阅读 K&R 时,我对如何确定文件位置产生了兴趣。通过文件位置,我的意思是流当前在文件中读取或写入的位置。我认为它必须与文件指针或它指向的数据有关。于是我检查了堆栈溢出,找到了如下答案:
Does fread move the file pointer?
答案表明文件指针会随着文件位置的变化而变化。这让我很困惑,因为在我的理解中,某个文件的文件指针应该总是指向同一个地址,这个地址存储了这个文件的信息。于是我写了一小段代码,试图找到答案:
#include<stdio.h>
int main(void)
{
char s[1000];
FILE *fp,*fp1,*fp2;
fp = fopen("input","r");
fp1 = fp; /* File poiter before fread */
fread(s,sizeof(char),100,fp);
fp2 = fp; /* File pointer after fread */
printf("%d\n",(fp1 == fp2) ? 1 : -1);
}
它给出了输出 1,我相信这表明文件指针实际上没有移动并且仍然指向相同的地址。我还将 fread 行更改为 fseek,它给出了相同的输出。那么文件指针是否会随着文件位置的变化而移动,或者我在验证过程中哪里出错了?
谢谢!
【问题讨论】:
-
Nooo.... 你肯定明白文件系统需要的不仅仅是一些移动的指针来控制对文件的访问! FILE*“文件指针”通常是文件控制块的基地址——关于文件的完整元数据结构。
-
您似乎混淆了指向“文件描述符”控制块的“文件 * fp”(在调用 fopen() 之后)指向“文件描述符”控制块中的数据表示(一般情况下)硬盘上的当前设备、柱面、磁道、扇区等。