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

时间:2015-08-21 14:43:22

标签: 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,它给出了相同的输出。那么文件指针随着文件位置的变化而移动,或者在验证过程中我错在哪里?

谢谢!

3 个答案:

答案 0 :(得分:5)

我认为你混淆了C中指针的一般概念,而不是“文件指针”的命名。 FILE只是一个结构,其中包含C stdio运行时库在使用stdio函数(如fopen(),fread()等)时需要与之交互的大多数“内务处理”属性。以下是结构示例:

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文件的索引或“指针”。因此,术语混乱。希望有所帮助。

答案 1 :(得分:1)

您是对的fp永远不会被freadfseek或其他f...函数更改。当然,除非您执行fp = fopen(...),否则您将fopen的返回值分配给fp,然后将fp更改为当然。

请记住,在C参数中按值传递,因此fread无法更改其值。

fread确实将内部结构fp更改为。

答案 2 :(得分:1)

您在常见定义下的文件指针与文件中的指针之间产生了一些混淆。 通常使用术语文件指针,我们引用指向 FILE 结构的指针。该结构包含管理文件访问所需的所有变量。此结构在成功打开文件创建,并且始终保持相同(相同的地址),直到您fclose()文件(未定义时)。

在FILE结构中,有许多指针指向磁盘上的文件块和当前记录内的位置。这些指针由文件I / O例程管理,在访问(读取或写入)文件时会发生更改。 这些指针是你引用的答案所指的那些。