我刚刚注意到通过“seekp”在“Microsoft Visual Studio”中更改位置时,我也会隐式地更改文件读取位置。
然而,我想知道这是否是“可移植”的行为?我是否可以期望读取和写入的位置始终相同?因此,
然而,我想知道这是否是“可移植”的行为?我是否可以期望读取和写入的位置始终相同?因此,
tellp
和tellg
是否总是返回相同的值?tellp
和tellg
是否总是返回相同的值?对于 文件位置,它们是相同的。换句话说只维护了一个指针。
来自27.9.1.1p3
:
一个共同的文件位置被维护用于输入序列和输出序列。
因此,对于文件流而言,seekg
和 seekp
是可以互换的。然而对于其他类型的流,这并不成立,因为它们可能会保持put和get位置的分离指针。
更新: 从所有的评论和资料来看,似乎对于 fstream
,seekp
和 seekg
使用相同的指针。但对于 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
而且,您所描述的行为似乎不符合这里的引用:
设置读取指针的位置。读取指针确定要从与流相关联的源中读取的下一个位置。
以及这里:
设置写入指针的位置。写入指针确定下一次输出操作将发生在输出序列中的位置。