2011-10-31 49 views
0

目前我的超載operator>>函數採用輸入[4: 1 2 3 4 ]並且工作正常。但是,我怎樣才能忽略任何數量的空格,以便它可以接受[ 4 : 1 2 3 4 ],即輸入前的任意數量的空格?如何忽略運營商過載中的空格輸入流>>

istream& operator>>(istream & stream, my_vector & vector_a) { 
    string token2; 

    int vec_size; 
    vector<double> temp_vec; 

    bool push = false; 

    while (stream >> token2) { 
     if (token2[0] == '[' && token2[2] ==':') { 
      push = true; 
     } 

     if (token2 == "]") { 
      break; 
     } 
     else if(!(token2[0] == '[' && token2[2] ==':')) { 
      stream.setstate(ios::badbit); 
     } 

     if(push) { 
      istringstream str(token2); 
      double v; 
      if (str >> v) 
       temp_vec.push_back(v); 
      vector_a.set_data(temp_vec); 
     } 
    } 

    return stream; 
} 

回答

3
stream >> std::ws; 

提取物作爲從在輸入序列中的當前位置的許多空白字符越好。只要找到非空白字符,提取就會停止。這些提取的空白字符不存儲在任何變量中。

請注意,即使skipws標誌先前在源碼流中爲unsetf,也會跳過空白,因此您應該執行此操作。

+0

我已經把流>> token2 >> std :: ws放在我的while循環條件下,但它仍然不起作用。我認爲這是你的意思? – cody

+0

@cody:你的問題不是空白,而是理解'標記'是什麼。而不是讀取一個字符串,讀一個'char'(接着是'ws'),然後是一個'int'(接着是'ws'),然後是另一個'char'。 –

0

我想我會做一些事情該順序:

stream.setf(std::skipws); 

char open_bracket, close_bracket, colon; 

unsigned num_items, temp_item; 

stream >> open_bracket; 
stream >> num_items; 
stream >> colon; 

for (int i=0; i<num_items; i++) { 
    stream >> temp_item; 
    temp_vec.push_back(temp_item); 
} 

stream >> close_bracket; 

if (open_bracket != '[' || close_bracket != ']' || colon != ':') 
    stream.setstate(ios::failbit); 

注意該位爲失敗的轉換設置是failbit,不badbit。 badbit旨在用於從磁盤讀取失敗的嘗試。

+1

現在你已經改變了用戶明確設置的'skipws'標誌的狀態。至少會嘗試將其恢復到原始值。 –

+1

@ K-ballo:和往常一樣,這裏有一個Boost庫: - ] [boost.io state savers](http://www.boost.org/libs/io/doc/ios_state.html) – ildjarn