是“寻求”和“seekg”可以互换吗?

时间:2013-01-15 00:27:16

标签: c++ position binaryfiles fstream

嗯,我刚刚注意到通过改变位置-in microsoft visual studio-通过“seekp”我隐式地也改变了处理文件时的读取位置。

我想知道这是否是“便携式”行为?我可以期待阅读的位置吗?写作总是一样的吗?因此:tellp& tellg总是返回相同的值?

2 个答案:

答案 0 :(得分:17)

对于文件位置,它们是相同的。换句话说,只保留了一个指针。

来自27.9.1.1p3

  

为输入序列和。维护联合文件位置   输出序列。

因此,seekgseekp对于文件流是可互换的。但是,对于其他类型的流不是这样,因为它们可能为put和get位置保存单独的指针。

答案 1 :(得分:10)

更新:所以从所有评论和所有内容来看,似乎对于fstream,seekp和seekg使用相同的指针。但对于stringstream和其他非基于文件的流,它们是分开的。


原帖:

使用g ++ 4.7.2在linux上不起作用。他们似乎是独立的:

#include <sstream>
#include <iostream>

int main(int, char**) {
    std::stringstream s("0123456789");
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
    s.seekp(2);
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
    s.seekg(4);
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
}

<强>输出:

put pointer: 0
get pointer: 0

put pointer: 2
get pointer: 0

put pointer: 2
get pointer: 4

您描述的行为听起来也不符合引号here

  

设置get指针的位置。 get指针确定   要在与流关联的源中读取的下一个位置。

here

  

设置put指针的位置。 put指针确定了位置   输出序列,下一个输出操作将采用   的地方。