c - 文件指针会随着文件位置的变化而移动吗?

标签 c file pointers

读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/

相关文章:

c - c 中的 OpenSSL 命令获取 RSA 中公钥的模数

c - 使用一个编译器创建的静态 C 库是否与另一个兼容?

java - 从 java 访问一个字符设备文件

C++: setter和getter ?

c - 在 C 中,释放结构体时是否需要手动释放结构体中的指针?

c - 从c中的字符串中删除标点符号和空格?

javascript - 将文件对象添加到 redux 存储会导致空属性对象

使用 ctypes 在 C 中动态访问 Python 变量

c - 初始化并打印 const char 指针

c - 如何将链表中的最后一个节点复制到变量中,然后删除链表中的原始节点?