1

istream と ostream のドキュメントを見ると、次の関数があります。

istream& seekg ( streampos pos );
istream& seekg ( streamoff off, ios_base::seekdir dir );

ostream& seekp ( streampos pos );
ostream& seekp ( streamoff off, ios_base::seekdir dir );

だけでなく、毎回関数の2つの形式があるのはなぜだろうか:

istream& seekg ( streamoff off, ios_base::seekdir dir = ios_base::beg );
ostream& seekp ( streamoff off, ios_base::seekdir dir = ios_base::beg );

標準の 4 つの関数の代わりに、これら 2 つの関数を使用することの違いは何でしょうか?

4

2 に答える 2

3

streamposstd::fpos<std::char_traits<char>::state_type>ストリーム内の現在の位置と現在のシフト状態を保持する typedef です。shift-jis などのマルチバイト エンコーディング スキームには、状態依存のエンコーディングがあります。これが基本的に意味することは、前の文字シーケンスに応じて、ストリーム内の特定のバイトを解釈する方法が異なる可能性があるということです。ストリーム内の位置を保持するだけでstreamposなく、ストリーム内のその時点でのシフト状態も保存されます。また、改行などはシステムによって解釈が異なるため、テキスト ファイル内の論理的な位置は、実際の物理的な位置とは異なる場合があります。streamposこれらは、単純な整数型にできない理由の一部です。

于 2012-10-05T05:50:48.337 に答える
0

iostreams ライブラリはかなり複雑で複雑です。タイプstreamposstreamoff実装定義であり、実装は、あなたが示唆しているように関連する整数にする必要はありません。

たとえば、実装によって、位置とオフセットの概念をそれぞれ表す、より大きく、より強力なプロキシ オブジェクトが提供される可能性があります。その場合、ユーザーは、オブジェクトを変換するのではなく、そのようなオブジェクトを直接シークできるようにすることを望む場合があります。もう一方に手動で。

于 2012-10-05T02:28:40.443 に答える