0

新しい問題

boost::tokenizer<> token(line);小数点をトークン化します!どうすればこれを止めることができますか?

以下の以前の問題は解決されました。

stringstreamからdoubleのベクトルに値を取得しようとしています。

std::ifstream filestream;
filestream.open("data.data");
if(filestream.is_open()){
    filestream.seekg(0, std::ios::beg);

    std::string line;
    std::vector<double> particle_state;
    particle_state.resize(6);
    while(filestream >> line){

        boost::tokenizer<> token(line);

        int i = -1;
        for(boost::tokenizer<>::iterator it=token.begin(); it!=token.end(); ++it){
            std::cout << *it << std::endl; // This prints the correct values from the file.

            if(i == -1){
                // Ommitted code
            }

            else{
                std::stringstream ss(*it);
                ss >> particle_state.at(i); // Offending code here?
            }
            i ++;
        }
        turbovector3 iPos(particle_state.at(0), particle_state.at(1), particle_state.at(2));
        turbovector3 iVel(particle_state.at(3), particle_state.at(4), particle_state.at(5));
        // AT THIS POINT: cout produces "(0,0,0)"
        std::cout << "ADDING: P=" << iPos << " V=" << iVel << std::endl;

    }


    filestream.close();
}

入力ファイルの内容:

electron(0,0,0,0,0,0);
proton(1,0,0,0,0,0);
proton(0,1,0,0,0,0);

ターボベクター3の詳細:

turbovector3は数学的なベクトルクラスです。(重要なことは、それが機能することです。基本的には、3つの項目を持つベクトルです。3つのdoubleを持つコンストラクターを使用して初期化されます。)

助けてくれてありがとう!

編集コードの変更:

std::stringstream ss(*it);
if(ss.fail()){
  std::cout << "FAIL!!!" << std::endl; // never happens
}
else{
  std::cout << ss.str() << std::endl; // correct value pops out
}
double me;
ss >> me;
std::cout << "double:" << me << std::endl; // correct value pops out again
particle_state.at(i) = me; // This doesn't work - why?
4

2 に答える 2

1

i省略したコードをインクリメントしますか? そうでない場合、else句は呼び出されません。stringstreamバッファの内容を出力してみてください:

  std::cerr << ss.str();

からの読み取りがss実際に失敗するかどうかも確認します。

  if (ss.fail())
      std::cerr << "Error reading from string stream\n";
于 2013-03-05T17:32:21.107 に答える
0

解決!私はたまたまこのサイトを見つけました: Link

解決策は、トークナイザーを次のように変更することです。

boost::char_delimiters_separator<char> sep(false,"(),;");
boost::tokenizer<> token(line,sep);

今それは動作します!

于 2013-03-05T18:05:27.083 に答える