最近在看文件操作函数时对文件内部的位置指针有点疑惑
测试代码:
pos = ftell(fp);
while (!(flag = feof(fp)))
{
fscanf_s(fp, "%c", &ch, 1);
pos = ftell(fp);
}
测试文本文件:
断点调试结果:
我对文件指针内部的成员_ptr的理解是“下一个要被读取的字符的地址”
对上面的测试结果我假设了两种文件开头和文件结尾的位置
第一种:文件开头的地址与文本文件中第一个字符'1'的地址相同,文件结尾的地址是文本文件最后一个字符的后一位,如下图
第二种:文件开头的地址是文本文件中的第一个字符'1'的前一位,文件结尾的地址与文本文件最后一位字符'3'的地址相同,如下图
现在不是很清楚是第一种还是第二种地址分布,其实就是对文本文件的首尾的理解很模糊,没搞清楚边界
望不吝赐教,不胜感激
两种都不是,首先明确几个概念:
结论是,文件物理存储和指针并没有什么关系,无需强行关联。
另外,也不需要太关注FILE * 这个结构的实现,它只是一个抽象意义的文件的概念。我们只需要关注标准化的api即可,不需要关注内部实现。 这个结构在不同的标准库里实现的都不大一样,也关注不过来。
具体内部封装的都是操作系统系统api的调用,只需要对外提供统一的标准库就行了。
最后, 就你这个_ptr的解释,我没有具体分析过源码,个人猜测应该就是FILE结构内部封装的一段缓冲区的地址,所以看起来小范围内连续读取时指向的地址是递增的。它指向的是缓冲区地址,而不是文件物理地址。 如果要详细了解的话,网上也有些源码解析的文章,https://www.zhihu.com/question/35829170
感谢解答