0

私は自分の課題のために単純な UTF-8 デコーダーを書こうとしています。私はC ++にかなり慣れていないので、ここで我慢してください...

エンコーディングが有効かどうかを判断し、どちらの場合も UTF-8 文字の値を 16 進数で出力する必要があります。最初のバイトを読み取り、この最初のバイトを使用してこの UTF8 文字のバイト数を決定したとします。問題は、最初のバイトを読み取った後、ifstream の位置を 1 バイト戻して UTF-8 文字全体を読み取るのに問題があることです。seekg() と putback() を試しましたが、常に BUS エラーが発生するか、テスト データではない奇妙な出力が表示されます。助けてください、ありがとう。

最初のバイトに peek() を使用できますが、エンコーディングが有効かどうかを判断するには、次のバイトを読み取る必要があります。ストリーム位置を戻す問題はまだ残っています。

4

5 に答える 5

2

代わりに peek() を使用して最初のバイトを読み取ることをお勧めします。seekg() は巻き戻しに機能するはずですが、BUS エラーは通常、コードのアラインメントの問題を壊すことが原因で発生します。これは、コード内で何か他の悪事を行っていることを示しています。

于 2009-10-23T04:52:28.870 に答える
2

なんで後回しにする必要があるの?予想されるオクテット数を知った後、残りの UTF-8 シーケンスを単純に読み取ることはできませんか?

于 2009-10-23T04:54:22.457 に答える
1

次のバイトを直接読み取り、取得したものに追加します。アテス・ゴラルが言ったように。それはよりきれいな私見です。

とにかく、次を使用してストリームポインタを移動できますseekg()

char byte = 0;
unsigned  int character = 0; // on every usage
ifstream file("test.txt", ios::binary);

file.get(byte);
......
file.seekg(-1, ios::cur); // cur == current position
file.get(
    reinterpret_cast<char*>(&character),
    numberOfBytesAndNullTerminator);

cout << hex << character;

2 番目のケースでは、 の最後にget()書き込むことに注意してください。そのため、null ターミネータを含めて必要なバイト数を指定する必要があります。したがって、2 バイトを読み取りたい場合は.'\0'character==> numberOfBytesAndNullTerminator = 3

于 2009-10-23T05:16:22.787 に答える
0

なぜ文字を元に戻す必要があるのか​​ わかりませんが、istream::unget() または istream::putback() は必要なことを行う必要があります。コンパイラのドキュメントでそれらを調べてください。

于 2009-10-23T05:18:34.603 に答える
-1

調べてください:

ifstream::seekg()
ifstream::teellg()
于 2009-10-23T05:27:51.357 に答える