0
    void  insert_into_stream(std::ostream& stream,  int number)
{
    int length = sizeof(int);
    char insert_buffer[sizeof(int)];
    memcpy(insert_buffer, &number, length);
    stream.write(insert_buffer, length);
}

int int_from_string(std::string string)
{
    int a; 
    std::istringstream(string)>>a;
    return a;
}

このコードは以前は機能していましたが、どのようなわずかな変更を行ったか覚えていないため、機能しなくなりました。数値 (たとえば 8001) が入ってきて、最後のステートメントの直前にデバッグしている場合、insert_buffer には「A」が含まれているため、明らかに何かがうまくいかず、2 番目の関数は 8001 を取得しません。

注 - ストリームを 2 番目の関数に送信する前に文字列に変換します。

最初の関数のどこが間違っていますか?

- -編集 - -

はい、私は間違っていました。最初の関数は実際に本来あるべきことを正確に実行していますが、2 番目の関数は間違っています。誰か修正してもらえますか?

4

2 に答える 2

1

これら 2 つの関数は、まったく異なることを行っています。

最初の関数は、整数の生のバイナリ表現をストリームに書き出します。

ビットをコピーしたところです。これは、バイナリ ファイルにシリアル化する場合に行うべき正しいことです。

それを元に戻すには、その 4 バイトを読み込んで、それを整数にキャストする必要があります。逆の場合と同じです。

もちろん、文字を調べると、整数ビットの 1 バイトの ASCII 表現になります。したがって、「A」はまったく意味がないため、他のものと同様に、そこに存在することは完全に合理的です。

ただし、2 番目の関数は ASCII 番号から整数値への変換を行っています。すなわちatoi。文字はASCII数値ではなく、バイナリ整数であるため、これはあなたがやろうとしていることには意味がありません。

編集のための編集: 上記とは正反対の、このようなものが必要です。

int int_from_string(const char* number)
{
    int a; 
    memcpy(&a, number, sizeof(int));
    return a;
}
于 2013-07-16T13:53:35.323 に答える
0

使ってみて

stream.write((const char*)&number, sizeof(number));

それははるかに短く、数値のタイプを変更することもでき、機能します(単純なタイプの場合)。

于 2013-07-16T13:48:23.590 に答える