文件指针未移动的原因?

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

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

先解析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;

读取的文件属性如图所示

内容均为原创,为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;

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

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

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

未经允许不得转载

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

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

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

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

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

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

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

未经允许不得转载

C语言中文件指针,文件位置指针,详细解析相关推荐

  1. C语言两个同名头文件,C lang: C语言中两个头文件引入相同的头文件(Header.h)

    C lang: C语言中两个头文件引入相同的头文件(Header.h) C lang: C语言中两个头文件引入相同的头文件(Header.h) [var1] For example: Header.h ...

  2. linux c 判断文件是否存在,C语言中如何判断文件是否存在

    C语言中如何判断文件是否存在 方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io. ...

  3. 【示例】C语言中利用数组存放函数指针

    C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...

  4. 结构体前面加星号_C语言中带星号的类型指针有哪些特性

    C语言中带星号的类型指针有哪些特性 指针是什么?很多人说,指针就是地址,那这么说的人肯定是对指针有所了解,他们这么说也不能说全错,我只能在这里说:"他们并没有真正学会指针,如果想学好指针,请 ...

  5. R语言中读取xlsx文件的方法

    R语言中读取xlsx文件的方法 安装包 install.packages("openxlsx") library(openxlsx) 文件名+sheet的序号 data<- ...

  6. ADS下C语言中局部变量的存储位置分配

    ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...

  7. c语言变量定义位置区别,C语言中变量定义的位置(C89和C99的区别)

    C语言中变量定义的位置(C89和C99的区别) 在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了"哪里使用哪里定义"的这种做法,所以当用C语言进行编程 ...

  8. 腾讯手游助手android文件夹,腾讯手游助手中找到文件安装目录位置的详细操作方法...

    很多的用户在使用腾讯手游助手软件的时候,并不熟悉其中的文件安装目录在什么位置?今日为各位带来的内容就是腾讯手游助手中找到文件安装目录位置的详细操作方法. 首先我们打开腾讯手游助手之后,可以在主界面就看 ...

  9. PHP中使用CURL之php curl详细解析和常见大坑

    这篇文章主要介绍了PHP中使用CURL之php curl详细解析和常见大坑 ,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 七夕啦,作为开发,妹子没得撩就"撩"下服务器 ...

  10. Linux内核中内存管理相关配置项的详细解析3

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析2 5. 2:1 compression allocator (zbud) 对应配置变量为:CONFIG_ZBUD. 此项默认为选中(如果前一 ...

最新文章

  1. C++中的静态绑定与动态绑定
  2. 繁琐又危险的任务(varchar--nvarchar)
  3. php lock sh,php文件加锁 lock_sh ,lock_ex
  4. Visual C++ 中的重大更改
  5. Linux c中使用系统时间
  6. 浅析Hadoop文件格式
  7. deflater java_java.util.zip 类 Deflater - Java 中文参考手册
  8. requests模块(代理)篇
  9. Quartz SpringMvc Mybatis操作数据库异常
  10. Hadoop HA on Yarn——集群配置
  11. String的创建和常量池的关系,intern()相关问题
  12. redis-实现排行榜
  13. No matching provisioning profile found: Your build settings specify a provis...
  14. 第7章 使用RAID与LVM磁盘阵列技术
  15. 【转帖】姑娘不是你想追,想追就能追。
  16. jaeger 链路追踪
  17. 计算机仿真技术与cad第三版课后答案,《计算机仿真技术与CAD》的习题答案.doc...
  18. Java连接redis选择指定库操作
  19. 安卓文字绘制和歌词器的简单实现
  20. java 分子 分母_Java写一个类表示分数。分数由分子和分母组成。

热门文章

  1. java设置word图片居中_Word中怎样快速对齐图片?这样操作,效率提升10倍
  2. [iOS 逆向 2] 越狱介绍
  3. 《谷物大脑》笔记(初稿)
  4. Excel批量复制公式、删除空白行
  5. 网络计算机怎么使用,如何让电脑使用ipv6地址?一文了解清楚
  6. Bootstrap栅格系统(屏幕大小)
  7. 【学习笔记】Arduino uno r3 控制led灯闪烁
  8. Windows程序设计-位图和位块传输
  9. cad完全卸载教程_如何完全卸载(删除)cad-百度经验
  10. 【技巧】谷歌Chrome浏览器清理缓存的两种方式