2013-05-15 35 views
4
std::string s; 
std::stringstream ss; 
ss << "a=b+c" << std::endl << "d=e+f"; 

std::getline(ss, s, '='); // gives me "a" 
std::getline(ss, s);  /* gives me "b+c" <- just want to peek: don't 
                want to change state of ss */ 
std::getline(ss, s, '+'); // BUT still want "b" here, not "d=e" 

s現在包含"a"現在,我怎麼偷看在行("b+c")的剩餘字符?那就是,沒有導致下一個操作從下一行開始?如何在使用getline之後查看剩餘的stringstream字符?

(例做作,我知道了。)

回答

3

可以使用的IStream :: seekg()這樣的回覆字符串流:

ss.seekg(ss.beg); 

然後你可以一遍讀它。這比創建一個新的更好,因爲它節省了內存,而且速度更快了一點。

+0

謝謝 - 看起來很有希望。如果我不想從一開始就開始'seekg',我怎麼能得到一個stringstream的當前位置(這樣我可以存儲該位置,稍後'seekg')? – mchen

+0

我相信你可以使用''s.scur''',但我不是100%肯定的。試試吧:) – Anickyan

+0

不,不會出現如此。即使在使用「getline」之後也會顯示1,這應該會消耗掉很多塊。 – mchen

1

你要麼需要作出新的stringstreams後:

std::getline(ss, s);  // gives me "b+c" 
std::stringstream ss2(s); 
std::getline(ss2,s, '+'); // will give b and maintain position in original ss 

或者使用替代以下幾點:

std::getline(ss, s, '+'); // will give b 

編輯:第二個選項改變ss的狀態,所以不符合你編輯的標準。

+0

怎麼樣,而不是在其餘*行*('「b + c」')偷看,我偷看剩下的*字符串*('「b + c \ nd = e + f」' )?那會更容易嗎?我希望會有一些緩衝區成員擁有所有剩餘的字符。 – mchen

1

您的問題簡單的解決辦法是使用另一個std::stringstreams

std::getline(ss, s, '='); // get "a" 
std::getline(ss, s); 

std::stringstream ss2(s); // create a stringstream with "b+c" 
std::getline(ss2, s, '+'); // gets "b" 

編輯:話又說回來,爲什麼你讀"b+c"而不是剛開"b"第一則"c"? (我不知道你的實現)

+0

舉出的例子,對不起 – mchen

+0

謝謝 - 我將如何對ss中的整個剩餘字符串進行「偷看」? – mchen

+0

當我意識到偷看得到單個字符並且可能不適合時,我刪除了我的評論。但不知道。 –

3

嘗試:

std::getline(ss, s, '=');      // gives me "a" 
std::getline(ss, s);       // gives me "b+c" 
ss.seekg(-(s.size()+1) ,std::ios_base::cur); // Roll back 
               // Need to +1 becuase we throw away a character 
               // with std::getline() that is not in the string. 

std::getline(ss, s, '+');      // gives me "b" 

的問題與上面的是,性病::函數getline()會扔掉 '\ n' 如果EOF之前發現它。但是如果它首先找到eof,那麼我們就會遇到問題,因爲+1將我們置於錯誤的地方。所以它適用於上面的例子,但除非你出示擔保,每行由「\ n」結尾,將最後一行失敗

所以我們可以使用所以tellg(),如果你不能提供出示擔保:

std::getline(ss, s, '=');      // gives me "a" 
std::streampos save = ss.tellg(); 
std::getline(ss, s);       // gives me "b+c" 
ss.seekg(save);        // Roll back 


std::getline(ss, s, '+');      // gives me "b" 
+0

是的......'tellg'是唯一的出路,或者使用二進制模式。 – Potatoswatter

+0

@Patatoswatter:或者我們可以試試:'ss.seekg( - (s.size()+(ss?1:0)),std :: ios_base :: cur);'可能必須重置相同的標誌時間。但對於'tellg()'版本來說也是如此。 –

相關問題