4

を使用してファイルの内容を読み取りたいとしますbasic_filebufboost::uintmax_tサイズが。というタイプがあり8 bytesます。私は次のように書き込もうとしています。

typedef basic_filebuf<uintmax_t> file;
typedef istreambuf_iterator<uintmax_t> ifile;

file f;
vector<uintmax_t> data, buf(2);

f.open("test.txt", std::ios::in | std::ios::binary);
f.pubsetbuf(&buf[0], 1024);

ifile start(&f), end;
while(start != end)
{
    data.push_back(*start);
    start++;
}

問題は、一部はbytes読み取られ、他は読み取られないことです。たとえば9 bytes、ファイルに次の番号が付けられているとします1-9

|1|2|3|4|5|6|7|8|9|

上記のコードを実行すると、1つの要素のみがにプッシュバックされます。これには、 :の元のデータからのデータのみdataが含まれます。4 bytesf

[0|0|0|0|4|3|2|1] --> only element in [data]

私は何が間違っているのですか?basic_filebuf使い方は知っていますが、直接使うのは初めてfilebufです。

4

2 に答える 2

4

basic_filebufは、「内部」文字型と「外部」文字型を扱います。「外部」のものはファイルの内容であり、常にバイトです。「内部」のものはテンプレートパラメータであり、プログラムとのインターフェースで使用されるものです。2つの間で変換するために、basic_filebufはそのロケールのcodecvtファセットを使用します。

したがって、指定したバイトを直接書き込む場合は、次の2つのオプションがあります。

  • 変換を実行しようとするのではなく、「内部」エンコーディングと「外部」エンコーディングの間でのみキャストする「縮退」codecvtを使用します。
  • basic_filebufを使用し、必ず「クラシック」ロケールを使用し、キャストして自分で文字を作成してください
于 2009-09-14T20:47:55.447 に答える
0

basic_filebuf型のオブジェクトは、型パラメーターElemで指定されたchar_typeに関係なく、char*型の内部バッファーを使用して作成されます。これは、Unicode文字列(wchar_t文字を含む)が内部バッファに書き込まれる前にANSI文字列(char文字を含む)に変換されることを意味します。Unicode文字列をバッファに格納するには、タイプwchar_tの新しいバッファを作成し、basic_streambuf :: pubsetbuf()メソッドを使用して設定します。

http://msdn.microsoft.com/en-us/library/tzf8k3z8(VS.80).aspxから

于 2009-09-14T19:57:55.200 に答える