C语言中文件指针,文件位置指针,详细解析

文件指针未移动的原因?

文件指针的第二个真面目?

大众所说的文件指针真的是代表文件位置的指针么?

先解析C语言中文件指针的普通指针与文件位置指针的区别

先说结论:文件类型的指针并不能像普通类型的指针直接输出,而且两者并不在同一等级

                文件指针并不能代表指针指向文件的位置,其实每一个文件都会有一个内部的指针叫文件位置指针

涉及到的函数有fseek(),fgetpos()

int main(){
	FILE* fp = NULL;
	fp = fopen(FILEPATH, "rb");
	if (fp == NULL) {
		printf("文件打开失败\n");
		return;
}
        GetFileLength(fp)
}	
DWORD GetFileLength(FILE *fq) {
		DWORD length = 0;
		fpos_t pos  = 0;
		fseek(fq, 0, SEEK_END);
		fgetpos(fq, &pos);
		printf("第一次%04d\n", pos);
		length = ftell(fq);
		fseek(fq, 0, SEEK_SET);///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		fgetpos(fq, &pos);
		printf("第二次%04\n", pos);
		//printf("文件大小=%d", length);
		return length;

C语言中文件指针,文件位置指针,详细解析_第1张图片读取的文件属性如图所示

内容均为原创,为bboywxy8340原创作品

未经允许不得转载

代码的整体意思为打开TestDll文件,获取TestDll的大小

注意fseek函数为移动文件指针的位置,在每一次对文件指针移动的过程中均对文件指针的位置进行输出,输出的结果为

 发现输出的指针位置并不是在内存中的位置,而是相对于文件内部的位置,第一次把指针移动到文件末尾所以输出的即是指针距离文件开始的距离即文件大小,第二次把指针移动到文件开头发现输出的就是相对于文件开始的位置就是0000;

内容均为原创,为bboywxy8340原创作品

未经允许不得转载

那么问题来了,如果我们直接输出文件指针,会不会也能输出文件指针移动后的位置

int main(){
	FILE* fp = NULL;
	fp = fopen(FILEPATH, "rb");
	if (fp == NULL) {
		printf("文件打开失败\n");
		return;
}
        GetFileLength(fp)
}	
DWORD GetFileLength(FILE *fq) {
		DWORD length = 0;
		fseek(fq, 0, SEEK_END);
		printf("第一次%04d\n", &fq);
        printf("第一次%04d\n", fq);
		length = ftell(fq);
		fseek(fq, 0, SEEK_SET);
		printf("第二次%04d\n", &fq);
         printf("第二次%04d\n", fq);
		return length;

C语言中文件指针,文件位置指针,详细解析_第2张图片

发现一个问题,前后移动完文件指针但是所显示的指针位置(地址)与值并未发生任何变化,很容易让人误解成文件指针并未发生移动

实际上用printf输出的文件指针只是在内存中指针存储的位置,并没有深入到文件指针指向文件空间的形式

内容均为原创,为bboywxy8340原创作品

未经允许不得转载

好比做文件类似于一块很长的内存,文件指针是指向内存的指针,可以在这块很长的内存中移动并且也可以记录文件指针所在位置,但是如果用printf函数访问输出只能把文件指针看做成普通指针,指向长长的内存的形式只能看成指向一个变量的形式,文件内存就只能粗略变为一个变量,不会出现文件指针位置的概念

所以文件指针的位置记录最好用fgetpos()函数进行访问

附:fgetpos函数:int fgetpos( FILE *fp, fpos_t *pos );

所以由此继续得出结论,我们口中常说的文件指针并不能完全代表文件指针的位置

事实上其实每一个文件的内部都会有一个指针,叫文件内部指针

我们平时在文件中移动的指针就是文件内部指针

内容均为原创,为bboywxy8340原创作品

未经允许不得转载

你可能感兴趣的:(c语言)