“seekp”和“seekg”是否可以互换使用?

27
我刚刚注意到通过“seekp”在“Microsoft Visual Studio”中更改位置时,我也会隐式地更改文件读取位置。
然而,我想知道这是否是“可移植”的行为?我是否可以期望读取和写入的位置始终相同?因此,tellptellg是否总是返回相同的值?

相关链接:https://dev59.com/FXXYa4cB1Zd3GeqP75R8 - Andrew
2个回答

22

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

来自27.9.1.1p3

一个共同的文件位置被维护用于输入序列和输出序列。

因此,对于文件流而言,seekgseekp 是可以互换的。然而对于其他类型的流,这并不成立,因为它们可能会保持put和get位置的分离指针。


13

更新: 从所有的评论和资料来看,似乎对于 fstreamseekpseekg 使用相同的指针。但对于 stringstream 和可能其他非文件型流,它们是分开的。


原始帖子:

在我的Linux机器上,使用g++ 4.7.2不起作用。它们似乎是独立的:

#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

而且,您所描述的行为似乎不符合这里的引用:

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

以及这里

设置写入指针的位置。写入指针确定下一次输出操作将发生在输出序列中的位置。


1
能否请给这个点踩的人留下一个评论,说明一下为什么? - matiu
1
我没有点踩,但我可以猜到原因:虽然你展示的对于一个字符串是准确的,但对于文件流来说却不是。 - Jerry Coffin
是的,很有道理 :) 我最初没有看到那个 fstream 标签。 - matiu
@JerryCoffin 可能是我的错误,起初我只在标签中指定了使用 fstream,后来进行了小的更新 :| - paul23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接