0

初めての投稿ですので、ご容赦ください。

リダイレクトを介してヘッダーを読み取る必要があるファイルがあり、cinを使用してバイトをキャプチャし、後で使用するために保存しています。

ファイルの16進ダンプは次のとおりです。

42 02 02 02 ff 0a 00 00  00 19 00 00 00 ff

私が持っているもの:

char magic, cs1, cs2, cs3, selector;
char temp1, temp2, temp3, temp4;
cin >> magic;
cin >> cs1;
cin >> cs2;
cin >> cs3;
cin >> selector; 
//   
cin >> temp1;
cin >> temp2;
cin >> temp3;
cin >> temp4;

最初の5バイトは、magicNumber、channelSize、channelSize、channelSize、selectorBitを表します。次の4バイトは、LSBからMSBで4バイトに分割された幅の値です。

16進数で10である0a(必要な値)でcinを使用すると、改行文字として読み取られるため、スキップされます。

cout << temp1 << endl;
cout << temp2 << endl;
cout << temp3 << endl;
cout << temp4 << endl;

これには(16進数で)含まれます:

0
0
0
19

cinは0aをスキップして、次の値を取得します。0aを強制的に読み取る方法はありますか?

さらに情報が必要な場合は、私に知らせてください。ありがとう

-カイル

4

2 に答える 2

2

これは、データがテキストcinであるistreamことを期待しているためです。

バイナリデータを使用している場合は、それがあなたが探しているものですistream::getistream::read

std::cin.get(temp1)
std::cin.get(temp2)
std::cin.get(temp3)
std::cin.get(temp4)

入力ストリームから4バイトの値を取得します。

char buff[4];
std::cin.read(buff, 4);

データのブロックをcharの配列に読み込みます。エンディアンがデータのエンディアンと一致する場合は、プレーン整数を使用できます。

于 2012-04-27T07:26:41.373 に答える
0

コードには2つの問題があります。>>1つ目は、バイナリデータの読み取りに使用 していることです。>>フォーマットされたテキストデータを読み取るためのものです。(特に、最初に行うこと>>は空白をスキップすることです。)2番目は、からバイナリデータを読み取ろうとしていることですcincinテキストモードで開かれるため、これは未定義の動作です。2つが同一であるシステム(Unix)では機能しますが、他のシステムでは、さまざまな驚きに遭遇する可能性があります。(表示する正確なデータは、ライブラリの実装によってはWindowsでも機能する可能性がありますが、他のバイナリデータは失敗します。0x1Aは通常ファイルの終わりを引き起こし、0x0Dは0x0Aが続く場合は消えます。テキストストリームからnullバイトを合理的に削除できます。)

于 2012-04-27T07:47:01.550 に答える