为何seekg(n)与seekg(n, ios::beg)不一定等价?
为什么
seekg(n)和seekg(n, ios::beg)可能不等价? 核心原因是这两个调用里的参数n语义完全不同:
seekg(n)的n是流内部维护的「位置标记值」,这个值只能来自同一个流之前调用tellg()的返回结果,它的作用是精准恢复到之前记录的位置,本身不具备“字节数”或“字符数”的数值意义。seekg(n, ios::beg)的n是相对于流起始位置的偏移量,单位取决于流的类型:二进制流中是字节数,文本流中是字符数(但可能受换行符转换等规则影响,偏移量的计算和实际存储不完全对应)。
拿std::basic_ifstream的文本模式举例:
在Windows系统下,文本文件中的换行符\n会被转换为\r\n存储。假设你打开一个文本文件,内容是hello\nworld,实际磁盘上存储的是hello\r\nworld。当你读取完hello后调用tellg(),得到的位置标记值可能是6(代表逻辑上hello之后的位置),但实际字节偏移是7(因为\n被转成了两个字节)。
这时候:
- 调用
seekg(6)会正确回到hello之后的逻辑位置,后续读取会拿到world; - 调用
seekg(6, ios::beg)会定位到磁盘上第6个字节(也就是\r的位置),后续读取会先拿到\n,再拿到world,结果完全错误。
简单来说,seekg(n)是“恢复到之前记录的位置”,而seekg(n, ios::beg)是“从开头数n个单位的位置”,两者的参数用途完全不重叠,自然不能等价。
内容的提问来源于stack exchange,提问作者kovacs lorand
相关产品推荐
相关产品推荐

