最近学习stringstream类,用途有取出字符串中特定字符,或者以特定字符为隔开
前提你得知道while(cin>>s)本质,以及getline基础
开始:
cin,cout是iostream类的实例,这个类分为istream,ostream,分别为输入流类和输出流类。
流理解成媒介,数据从一个地方转移到另一个地方的“中转站”
stringstream也是一种输入输出流类。
iostream代表从“键盘缓冲区”作输入输出。
stringstream代表从“字符串”作输入输出。
本文重点讲述iostream基础用法,理解好了可以去进阶stringstream:【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)-优快云博客
1、先从while(cin>>s)说起:
string s;
while(cin>>s){
cout<<s<<endl;
}
cin>>s 返回的是一个istream对象,正常返回istream对象,被while视为正确,进入循环体。
但是何时返回istream对象?
一、
键盘缓冲区输入完成:"a bc d",按下回车enter(也充当最后的分隔符,不理解分隔符先继续往后看),cin输入流实例成为 "a bc d",缓冲区中有什么,cin输入流中就是什么。
二、
对于普遍的输入流,执行cin>>s,代表数据流到具体对象中。正常情况下,非空格字符开始,遇到空格结束,并返回istream对象,此时while识别为true,第一次进入循环,此时的s="a"。
三、
流的其中一个特点是用掉后就没了,第二次循环,原本流中的“a”用尽,开始向s流入"bc",知道遇到空格停止,进入循环。
四、
如此反复,输入流中的所有内容,都分段地进入过s字符串,完成了流入操作
2、getline方法
string s;
while(getline(cin,s,' ')){
cout<<s<<endl;
}
getline()的原型是istream& getline ( istream &is , string &str , char delim );
与>>运算符一样,正常情况返回一个istream对象,while识别为true
is是输入流,str是流入的具体对象 ======== is>>str
所以is可以传入cin,因为cin就是键盘缓冲区的输入流,str传入s,最后等效为 ========= cin>>s
完全一样!
delim代表流入s时,遇到的中断字符(分隔符),如果是 ‘空格’ ,则和cin>>一样,以空格为中断。
3、特别一提
并非只有当遇到中断符才结束一次流入,若
char chr;
while(getline(cin,chr,' ')){
cout<<chr<<endl;
}
同样键盘缓冲区输入完成:"a bc d",当“bc“”的‘’b‘’满足一次流入char类型,也会进入循环。下一次再让'c'进入。
4、总结
istream相当于一个从缓冲区获取的总流,>>,getline()方法,类似于产生一段段子流,流入到具体对象中,子流划分默认用空格(最后回车此时也算),也可用getline指定用于划分的字符。
产生的子流,没有while,就只能流入一次,通过while才能将全部子流流入。
子流的最后必须要有分隔符,cin为默认情况下回车代替了分隔符空格。自定义的情况下必须补上,如:
string s2;
while(getline(cin,s2,',')){
cout<<s2<<endl;
}
输入:ssc,fd sfd,fasd
结果为:
ssc
fd sfd
输入:ssc,fd sfd,fasd,
结果为:
ssc
fd sfd
fasd
(最后的逗号不能少)
流入的对象满了的情况,自动产生子流(如上述的3、特别一提)
getline()只能用于流入的对象是string类型,自己回去看getline的参数类型
1万+

被折叠的 条评论
为什么被折叠?



