"seekp"和"seekg"可以互换吗?

are "seekp" & "seekg" interchangeable?

本文关键字:互换 seekp seekg      更新时间:2023-10-16

我刚刚注意到,在microsoft visual studio中,通过"seekp"来改变位置,在处理文件时,我也隐式地改变了读取位置。

我想知道这是否是"可移植"的行为?我能期待阅读& &;写作是为了保持不变吗?因此:tellp &tellg总是返回相同的值吗?

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

From 27.9.1.1p3:

为输入序列和输出序列。

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

Update:所以从所有的评论和一切,似乎对于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

你描述的行为听起来也不符合这里的引号:

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

:

设置放置指针的位置。中的位置下一个输出操作将要执行的输出序列的地方。