读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,它给出了相同的输出。那么文件指针是随着文件位置的变化而移动,还是我在验证过程中错在哪里?
谢谢!
最佳答案
我认为您混淆了 C 中指针的一般概念与“文件指针”的命名法。 FILE 只是一个结构,其中包含 C stdio 运行时库在使用 fopen()、fread() 等 stdio 函数时需要与之交互的大部分“管家”属性。以下是该结构的示例:
typedef struct {
char *fpos; /* Current position of file pointer (absolute address) */
void *base; /* Pointer to the base of the file */
unsigned short handle; /* File handle */
short flags; /* Flags (see FileFlags) */
short unget; /* 1-byte buffer for ungetc (b15=1 if non-empty) */
unsigned long alloc; /* Number of currently allocated bytes for the file */
unsigned short buffincrement; /* Number of bytes allocated at once */
} FILE;
请注意,这可能在某种程度上取决于平台,所以不要把它当作福音。因此,当您调用 fopen() 时,底层库函数与 O/S 的文件系统 API 交互,并在该结构中缓存有关文件、缓冲区分配等的相关信息。 fopen() 函数为此结构分配内存,然后以 C 指针的形式将该内存的地址返回给调用者。
将指针值赋给另一个指针对 FILE 结构内的属性没有影响。但是,FILE 结构在内部可能具有指向底层 O/S 文件的索引或“指针”。因此,术语困惑。希望对您有所帮助。
关于c - 文件指针会随着文件位置的变化而移动吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143242/