2017-09-20 34 views
0

我想在名爲trajectory.txt一個簡單的文件(以下簡化的)看起來像這樣的閱讀下破壞:字符串流只適用於一條線,然後再利用

true true false 
2 

我的代碼很簡單,讀取和存儲前兩行在一些變量中。

#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() 

的問題是,在倒數第二行,num_waypoints_str留空,stringstream的假設中的值讀取後。

使用GDB我能夠確認stringstream實際上取值爲「2」,但它似乎有問題將值指向num_waypoints_str。

我因此只能有兩個問題:

  1. 爲什麼會stringstream的不能通過它的值的字符串? (是否有是一個新的範圍內做)
  2. 可我的代碼可以簡化爲直接從stringstream的輸入線1至布爾pos或者我必須從字符串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

的字符串流並不神奇地綁定到您的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的內容。 Note:與其他流一樣,stringstreams也有標誌,例如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); 
相關問題