2017-09-20 9 views
0

を再利用したときに、私はこのようになりますtrajectory.txt名付け(以下簡体字)、単純なファイルを読み込むしようとしている壊れるその後、一行のために働きますいくつかの変数の最初の2行。にstringstreamは

#include <string> 
#include <fstream> 
#include <sstream> 
#include <iostream> 

int main(int argc, char** argv) 
{ 

int num_waypoints=0; 
bool pos=1, vel=0, acc=0; 
std::ifstream file; 
std::string filename = "trajectory.txt"; 
file.open(filename.c_str()); 
std::string line; 

// Read first 2 lines 
if (std::getline(file, line)) { 

    //sstream for each line 
    std::stringstream ss(line); 

    //first line 
    std::string pos_str, vel_str, acc_str; 
    ss >> pos_str >> vel_str >> acc_str; 

    //evaluate 
    (pos_str == "true" ? pos = true : pos = false); 
    (vel_str == "true" ? vel = true : vel = false); 
    (acc_str == "true" ? acc = true : acc = false); 

    //second line 
    if (std::getline(file, line)) {    //GDB confirms, line == "2" 
    std::string num_waypoints_str;    
    ss >> num_waypoints_str;     //THIS DOES NOTHING? 
    num_waypoints = stoi(num_waypoints_str); 
} 

} //main() 

問題がにstringstreamは値を読み込むことになった後、最後の行に2番目に、num_waypoints_strを空のままにされていることです。

GDBを使用して、stringstreamが "2"の値を実際に取ったことを確認できましたが、num_waypoints_strに値を送るのに問題があるようです。

  1. がなぜにstringstreamを文字列にその値を渡しません:

    従って私は2つのだけ質問がありますか?

  2. 文字列の値を評価することによって、文字列posに直接行1を入力するか、文字列pos_strからposに変換する必要がありますか?

私はg++ -g -std=c++11 main.cpp -o mainでコンパイルしています。問題を再現してみてください。私は何かが簡単でないと感じています。

+0

"GDBは、行==" 2 ""で、行は= ssであることを確認します。ストリーム 'ss'には、コンストラクタに渡した行が含まれています。最初の行は読み込みますが、その後は' ss'の内容を変更しませんが、 'getline'で読み込んだ行'ss'にはありません) – user463035818

+1

' ss'に新しい行を入れるには、 'ss.str(line)'にそれを与えなければなりません。あなたの心を読んでそれをコピーすることはありません。 – spectras

答えて

4

にstringstreamは、魔法のあなたのstd::string line;にバインドされていません。

//second line 
    if (std::getline(file, line)) {    //GDB confirms, line == "2" 
    std::string num_waypoints_str;    
    ss >> num_waypoints_str;     //THIS DOES NOTHING? 
    num_waypoints = stoi(num_waypoints_str); 

ssはまだずっと先に本のコンストラクタで設定されたその値を持っています。より正確には、

std :: stringstreamのconstructorは、指定した文字列のコピーを作成します。バインドされません。

別のものを作成したくない場合は、std::basic_stringstream::strを使用してssの内容を更新できます。 :他のストリームのように、ストリングストリームにはフラグがあります。たとえば、eofのようにリセットする必要があります。したがってあなたの場合:

ss.clear(); 
    ss.str(line); 
+0

最後のコードブロックを開始するために 'ss.str(line)'を追加しても私には何もしませんでした。私は 'ss.str(std :: string())'を呼び出して結果のない文字列ストリームをクリアしようとしました – Max

+0

@Max申し訳ありませんが、私は私の答えに説明を加えました! – DrSvanHay

1

非常に近い回答です。また、再利用する前にストリングストリームをクリアする必要があります。

//first use 
getline(file, line); 
stringstream ss(line); 
ss.clear() 

//second use 
getline(file, line); 
ss.str(line); 
関連する問題