fstream和文件指针移动

时间:2013-11-17 17:06:37

标签: c++

我一直在尝试保存文件指针位置,然后重置它,然后将其设置回来,但事情看起来并不像我想要的那样。

我想出了:

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将其设置回以前的位置,我应该考虑哪些其他选择?

感谢

3 个答案:

答案 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);