看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《redonizuka (R大)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : QT : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : None : 問題(Question): : 從上篇發文,我學會了使用istringstream,但在導入上有些觀念要詢問, : 以一個string作範例,如程式碼,為了要將此字串分割於陣列裏頭 : 使用while(istr>>b[i]),讓他"依序"將值導入於陣列, : 想問的是之所以會有依序這個動作是他本身函式內建的動作嗎? : 我原本以為他是搬移,將istr內的搬至b[i],因此有依序 : 但將istr.str() cout出,卻發現他並不是搬移 : 再來,若我在while loop裡面再對另一個陣列c做導入 : while(istr>>b[i]) : { : istr>>c[i] : 會使得我istr又往前一個資料 : 想清楚釐清這方面的觀念 : 謝謝 : 程式碼(Code):(請善用置底文網頁, 記得排版) : #include<iostream> : #include<sstream> : using namespace std; : int main() : { : string s="1 10 22 33"; : int b[4],c[4]; : istringstream istr; : istr.str(s); : int a=0; : while(istr>>b[a]) : { : for(int i=0;i<4;i++) : cout<<b[i]<<"\t"; : a++; : cout<<istr.str()<<endl; : } : return(0); : } 以下的程式應該可以解開你的問題: string foo("721 68 93") ; istringstream istr(foo) ; int i , n ; while ( 1 ) { cout << istr.tellg() ; if ( istr >> n ) cout << " : " << n << " [" << istr.str() << "]" << endl ; else break ; } 輸出: 0 : 721 [721 68 93] 3 : 68 [721 68 93] 6 : 93 [721 68 93] 9 字串串流與檔案串流是由將要讀入的位置開始讀取資料,此位置可由 tellg() 取得 (g 為 get 的字頭),在資料讀入後,會隨之更新下一筆將 要讀入的位置起點,原始的串流資料不會變更,這樣的作法會比將已讀出的 資料拿掉更有效率。 因此,此程式,istr 串流的資料與下標位置如下: 下標 : 012345678 資料 : 721 68 93 程式剛開始時 tellg 的位置 0 ,此為串流的第一個字元,之後 讀入第一個數字 721 存到 n 後,下一筆將要讀取字元的位置就由下標 3 開始(此字元為空格字元),讀入 68 後,tellg 為 6,依此類推。 我們也可以使用 seekp(k) 由下標 k 開始讀取資料,例如: 若在 while( 1 ) 之前加上 seekg(4) 式子,則 istr 將由下標 4 開始 讀資料,因此程式將會輸出: 4 : 68 [321 68 93] 6 : 93 [321 68 93] 9 以上供你參考 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.25.21 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1408324261.A.8AD.html
redonizuka: (Y),多謝指導,受益良多,感謝 08/18 13:45