3

サイズがstd::wstring139,580,199 文字の があります。

デバッグのために、次のコードでファイルに出力しました。

std::wofstream f(L"C:\\some file.txt");
f << buffer;
f.close();

その後、文字列の末尾が欠落していることに気付きました。作成されるファイルのサイズは 109,592,584 バイトです (「ディスク上のサイズ」は 109,596,672 バイトです)。

バッファにヌル文字が含まれているかどうかも確認し、次のようにしました。

size_t pos = buffer.find(L'\0');

結果が期待されますstd::wstring::nposが、それはです18446744073709551615が、私の文字列には最後に null char がないので、おそらく問題ありません。

なぜすべての文字列がファイルに出力されていないのか、誰かが説明できますか?

4

1 に答える 1

4

多くはロケールに依存しますが、通常、ディスク上のファイルは、wchar_t. 実際のfilebuf読み取りと書き込みを行う は、組み込まれたロケールに従ってエンコーディングを変換します。また、異なるエンコーディングまたはエンコーディング形式の文字列の長さの間にはあいまいな関係しかありません。(そして、システムが認識するサイズは、ファイルから読み取ることができるバイト数に直接対応していません。)

すべてが書き込まれたかどうかを確認するには、クローズf 後のステータスを確認します。

f.close();
if ( !f ) {
    //  Something went wrong...
}

間違っている可能性があることの 1 つは、外部エンコーディングがいずれかの文字の表現を持っていないことです。ロケールにいる場合"C"、これは基本的な実行文字セット以外の文字で発生する可能性があります。

上記のエラーがない場合、すべての文字列が書き込まれていないと仮定する理由は何もありません。別のプログラムで読み取ろうとするとどうなりますか? 同じ数の文字を取得しますか?

std::wstringそれ以外の場合、ヌル文字は;内の他の文字と同様の文字です。ストリームに出力される場合も含め、特別なことは何もありません。std::wstring::npos18446744073709551615 は、64 ビット マシンで期待する値と非常によく似ています 。

編集:

Mat Petersson のコメントをフォローアップします。実際には、ファイルのバイト数がstd::wstring. (std::wstring::size() コード ポイントの数を返します。) 何をstd::wstring::size()返すかではなく、バイト単位で考えていました。したがって、最も可能性の高い説明は、ターゲットエンコーディングで表現できない文字が文字列に含まれていることです(デフォルトでは、コードポイント32〜126の文字といくつかの制御文字のみをサポートする可能性があります)。

于 2013-08-14T10:00:36.657 に答える