如何查找()从end开始定位x
How to seekg() to position x from end
我正在寻找一种方法来设置我的get指针在位置x从fstream结束
我试着
file.seekg(-x, ios_base::end);
但是根据这个问题,这一行是未定义的行为。
- 我怎么能,以任何方式,从流的结尾寻求x的位置?
如果你想将指针设置在距离结束的x位置,你需要知道结束的位置,所以你需要以:
开始:file.seekg(0, ios_base::end);
int length = file.tellg();
当你知道文件的长度时,你可以设置你的指针:
file.seekg(length - x, ios_base::beg);
问题与文本模式有关,该模式可能会将文件中的某些字节序列转换为不同大小的序列。
以Windows下的文本模式为例。在这里,磁盘上文件中的字节序列'r' 'n'
在读取时被转换为'n'
。现在假设您有一个文件:
Hellorn
Worldrn
如果你定位自己在file.seekg(-1, ios_base::end);
的结果是未定义的,因为它不清楚的结果应该是:
- 你应该简单地定位在
'n'
吗?但是在这种情况下,以相反的顺序读取文件将与以正确的顺序读取文件不一致。 - 它应该定位在
'r'
,因为'r' 'n'
应该被理解为单个字节?但是在这种情况下,定位必须一个字节一个字节地进行,对于每个字节,库都必须检查前一个字节,以防。
顺便说一下,这也是为什么你只应该直接seekg()
到tellg()
之前获得的位置。
如果你必须从末尾开始做这种定位,如果你以ios::binary
打开文件因为这样你就可以保证一个字节永远是一个字节无论从末尾开始计数还是从开始计数
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 重新定位图像时如何前进到下一个内存块
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何从头开始创建 avi 文件?
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 自一周开始以来的秒数?
- 一旦双簧管录制开始,主 UI 线程就会被阻止
- 流填充字符的默认定位
- GStreamer在开始任何播放之前进行搜索
- 使 std::fstream 写入文件末尾,但从头开始读取
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 哪个C++规范开始支持 std::vector
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在调试中通过传递引用开始
- 如何使用 picojson.h 在 c++ 中从头开始创建 json 对象
- 从特定键开始遍历地图
- 列表的有效性在插入后开始迭代器
- 如何查找()从end开始定位x