27

好吧,我刚刚注意到,通过“seekp”更改位置 - 在 microsoft Visual Studio 中,我在处理文件时也隐含地更改了读取位置。

但是,我想知道这是否是“便携式”行为?我可以期望阅读和写作的位置始终相同吗?因此:将tellp&tellg总是返回相同的值?

4

2 回答 2

19

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

来自27.9.1.1p3

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

因此,seekg并且seekp对于文件流是可互换的。但是,对于其他类型的流,情况并非如此,因为它们可能为 put 和 get 位置保存单独的指针。

于 2013-01-15T00:40:13.063 回答
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

此外,您描述的行为听起来不符合此处的引号:

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

这里:

设置放置指针的位置。put 指针确定输出序列中下一个输出操作将发生的位置。

于 2013-01-15T00:34:26.913 回答