Re: [問題] istringstream >>導入觀念詢問

作者: pziyout (pziyout)   2014-08-18 09:10:59
※ 引述《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
以上供你參考
作者: redonizuka (R大)   2014-08-18 13:45:00
(Y),多謝指導,受益良多,感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com