2011-09-13 2 views
1

asyc_read()で埋められているstreambufから読み込みに問題があります。 VSの私のコードをステップ実行するとき、私は正しいデータがバッファ内にあることがわかりますが、私はそれを読むために行くとき:ブーストbasic_streambufからistreamで読み込み中に問題が発生しました

std::istream is = std::istream(&buffer_); 

unsigned short type; 
unsigned short size; 

is >> type; 
is >> size; 

種類とサイズ変数は初期化された値のままです。エラーも何もスローされません。私は本当にこれがまったく同じように変数にオフデータを読み込み、私は同様のコードを見てきたケースである理由として困惑

EDIT:

: はので、ここで、その後、上記のコードを呼び出して、私のasync_readコードです確かに、ストリーム( if(is) {...})のステータスを確認します typeが初期化された値に残っている場合
boost::asio::async_read(socket_, 
    buffer_, 
    boost::asio::transfer_at_least(4), 
    boost::bind(&Session::handleReadBody, this, 
    boost::asio::placeholders::error, 
    boost::asio::placeholders::bytes_transferred)); 
+0

こんにちは。スタックオーバーフローへようこそ!問題があることを示す最小限の完全なプログラムを投稿してください。 –

答えて

2

は、それがis >> type;が失敗したことは明白です。

transfer_at_least(4)のように、空白で区切られたASCII文字列ではなく、バイナリデータを転送していると思われます。その場合は、read()

int16_t type, size; 
data.read(reinterpret_cast<char*>(&type), sizeof type); 
data.read(reinterpret_cast<char*>(&size), sizeof size); 

を使用してください。ただし、バイトオーダーに注意してください。

+0

ありがとうございました。私はバイナリデータを転送していたことを明確にしておかなければなりませんでした。本当に違いがあることは分かっていませんでした。もしstreambufのデータをistreamでラップするよりも簡単な方法がある場合は、 – dee

+0

@deeそれはストリームからの読み込みに違いがあります( '演算子>>'は空白で区切られたASCIIデータ、 read() 'はバイナリ用です)。 asioバッファからのより直接的な読み込みは、 'reinrepret_cast (boost :: asio :: buffer_cast (buffer.data())' – Cubbi

関連する問題