我一直在尝试保存文件指针位置,然后重置它,然后将其设置回来,但事情看起来并不像我想要的那样。
我想出了:
fstream f;
// open...
long long p = f.seekg(); // Save previous location
f.seekg(std::ios::beg); // Set ptr to the file beginning
// Work with the file...
f.seekg(p); // return ptr to the previous location (p)
如果我尝试在以下命令后打印fileptr位置,则值为-1 .. 是因为我在处理文件时达到了EOF吗? 如果我不能使用seekg将其设置回以前的位置,我应该考虑哪些其他选择?
感谢
答案 0 :(得分:3)
long long p = f.seekg();
甚至无法编译,你可能意味着tellg
。
f.seekg(std::ios::beg);
这是错的; seekg
有两个重载,一个接受流中的位置,另一个接受来自某个特定位置的偏移量,用枚举指定。 std::ios::beg
/ cur
/ end
仅适用于此其他重载。所以,你想要
f.seekg(0, std::ios::beg);
而且,最重要的是,如果您的流处于脏状态(eof,fail,bad),搜索将不会产生任何影响。您必须先使用f.clear()
清除状态位。
顺便说一下,如果要安全存储文件指针位置,则应使用类型std::istream::streampos
。所以,总结一下:
std::istream::streampos p = f.tellg(); // or, in C++11: auto p = f.tellg();
// f.clear() here if there's a possibility that the stream is in a bad state
f.seekg(0, std::ios::beg);
// ...
f.clear();
f.seekg(p);
答案 1 :(得分:0)
tellg
返回文件位置指示符:
std::istream::pos_type p = f.tellg();
// ^^^^^
答案 2 :(得分:0)
如果遇到EOF
,请先重置标志f.clear(); // clear fail and eof bits
f.seekg(p, std::ios::beg);