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