首页新闻找找看学习计划

C语言——文件内部位置指针问题

0
悬赏园豆:100 [已解决问题] 解决于 2019-07-23 08:22

最近在看文件操作函数时对文件内部的位置指针有点疑惑

测试代码:

  pos = ftell(fp);
    
    while (!(flag = feof(fp)))
    {
        fscanf_s(fp, "%c", &ch, 1);
        pos = ftell(fp);
    }

测试文本文件:

断点调试结果:

我对文件指针内部的成员_ptr的理解是“下一个要被读取的字符的地址”

对上面的测试结果我假设了两种文件开头和文件结尾的位置
第一种:文件开头的地址与文本文件中第一个字符'1'的地址相同,文件结尾的地址是文本文件最后一个字符的后一位,如下图

第二种:文件开头的地址是文本文件中的第一个字符'1'的前一位,文件结尾的地址与文本文件最后一位字符'3'的地址相同,如下图

现在不是很清楚是第一种还是第二种地址分布,其实就是对文本文件的首尾的理解很模糊,没搞清楚边界

望不吝赐教,不胜感激

蓝海人的主页 蓝海人 | 初学一级 | 园豆:52
提问于:2019-07-22 20:21
< >
分享
最佳答案
1

两种都不是,首先明确几个概念:

  1. 文件并不是在磁盘物理连续保存的,它只是一个逻辑意义的连续流的概念,同一个文件物理上则可能分布在磁盘不同的地方,它的物理地址并不是那么简单的事情。
  2. 指针是指向内存的,而不是文件物理地址的, 打开文件也不是把文件内容全部映射到内存中,要不然2g内存的电脑都无法打开4g的文件了。

结论是,文件物理存储和指针并没有什么关系,无需强行关联。

另外,也不需要太关注FILE * 这个结构的实现,它只是一个抽象意义的文件的概念。我们只需要关注标准化的api即可,不需要关注内部实现。 这个结构在不同的标准库里实现的都不大一样,也关注不过来。
具体内部封装的都是操作系统系统api的调用,只需要对外提供统一的标准库就行了。

最后, 就你这个_ptr的解释,我没有具体分析过源码,个人猜测应该就是FILE结构内部封装的一段缓冲区的地址,所以看起来小范围内连续读取时指向的地址是递增的。它指向的是缓冲区地址,而不是文件物理地址。 如果要详细了解的话,网上也有些源码解析的文章,https://www.zhihu.com/question/35829170

收获园豆:100
天方 | 大侠五级 |园豆:5264 | 2019-07-22 23:14

感谢解答

蓝海人 | 园豆:52 (初学一级) | 2019-07-23 08:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册