さて、Microsoft Visual Studio で "seekp" を使用して位置を変更すると、ファイルを処理するときに暗黙的に読み取り位置も変更されることに気付きました。
しかし、これが「移植可能な」動作であるかどうか疑問に思っていますか? 読み取りと書き込みの位置が常に同じであると期待できますか? その結果: tellp
&tellg
は常に同じ値を返しますか?
さて、Microsoft Visual Studio で "seekp" を使用して位置を変更すると、ファイルを処理するときに暗黙的に読み取り位置も変更されることに気付きました。
しかし、これが「移植可能な」動作であるかどうか疑問に思っていますか? 読み取りと書き込みの位置が常に同じであると期待できますか? その結果: tellp
&tellg
は常に同じ値を返しますか?
ファイル位置の場合、それらは同じです。つまり、維持されるポインターは1 つだけです。
から27.9.1.1p3
:
ジョイント ファイルの位置は、入力シーケンスと出力シーケンスの両方で維持されます。
そのため、seekg
とseekp
はファイル ストリームと交換可能です。ただし、これは他のタイプのストリームには当てはまりません。プット位置と取得位置に対して別々のポインターを保持している可能性があるためです。
更新:したがって、すべてのコメントとすべてから、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 ポインターは、ストリームに関連付けられたソース内で次に読み取られる場所を決定します。
そしてここに:
put ポインターの位置を設定します。put ポインターは、次の出力操作が行われる出力シーケンス内の位置を決定します。