1

私はC ++にかなり慣れていないので、単独で検索しても解決策が見つからないという問題に遭遇しました。

問題は、以下のループ内で istringstream の値が変更されないのはなぜですか?

dirs[ 0 ] と dirs[ 1 ] から値を取得し、それらを増加する int i に変更することはありません。ところで。dirs[ i ] と dirs [ i + 1 ] の値は 16 進数値として格納されます (例: 0F9C8924)。

以下は私の最新のセットアップです。他の方法をいくつか試しましたが、成功しませんでした。たとえば、ループ内に istringstream を持ち、ios_base::trunc などを使用しています。

またdirs[ i ]、DO には異なる値があり、正しく読み取られますが、istringstream を介して文字列 hex を unsigned int にしようとすると、新しい値が取得されません。

unsigned int f;
unsigned int t;
istringstream ss;
istringstream ss2;
for( int i = 0; i < count; i+=3 ) {
    ss.clear();
    ss2.clear();
    ss.str( dirs[ i ] );
    ss2.str( dirs[ i + 1 ] );

    ss >> f;
    ss2 >> t;



    // do something else with dirs[ i + 3 ], not relevant
}

countdirsはグローバル変数でありcount、別の関数で増加します。その値のカウントは ですdirs

これが以前に尋ねられた場合は申し訳ありませんが、私が見つけた解決策はうまくいきませんでした。ss.clear()またはなどwhile( ss >> f )

提供されたヘルプに事前に感謝します。

4

3 に答える 3

5

質問は少し紛らわしいです。入力は「0F9C8924」のような文字列ということですか?

もしそうなら、試してみてくださいss >> hex >> f;

コードに何らかのエラー処理を記述して、いつ、なぜ問題が発生したかがわかるようにする必要があります。ss.clear()そもそもエラーフラグが設定された理由を見つけることなく、エラーフラグをやみくもにクリアします。

于 2011-05-15T16:01:21.667 に答える
0

これにより、16 進文字列の 10 進値が出力されます。これは、あなたの望むことですか?

#include <sstream>
#include <iostream>
using std::istringstream;
unsigned int f;
unsigned int t;
const char * dirs[12] = { 
    "0x15", "0x16", "dummy", 
    "0x11", "0x12", "dummy",
    "0x115", "0x116", "dummy",
    "0x111", "0x112", "dummy"
    };
unsigned int count = sizeof(dirs) / sizeof(const char *);
int main(int, char **) {
    for( unsigned int i = 0; i < count; i+=3 )
    {
        istringstream ss1( dirs[ i ] );
        istringstream ss2( dirs[ i + 1 ] );

        ss1 >> std::hex >> f;
        ss2 >> std::hex >> t;
        std::cout << "f is " << f << std::endl;
        std::cout << "t is " << t << std::endl;

        // do something else with dirs[ i + 2 ], not relevant
    }
    std::cin.get();
    return 0;
}
于 2011-05-15T17:33:18.423 に答える
0

これを試して:

unsigned int f;
unsigned int t;
for( int i = 0; i < count; i+=3 )
{
    istringstream ss1( dirs[ i ] );
    istringstream ss2( dirs[ i + 1 ] );

    ss1 >> f;
    ss2 >> t;

    // do something else with dirs[ i + 3 ], not relevant
}

clear() がストリームを空にすると思ったと思います。str(<string>) は、ストリームにテキストを設定します。おそらく、ループ内で stringstream を宣言するのが最善です。これは、ループの最後で破棄され、ループに入るたびに再作成されることを意味します。次に、コンストラクターでそれらを初期化できます。

于 2011-05-15T16:20:28.810 に答える