说明:流输入运算符,在一定程度上为C++程序的开发提供了很多便利,我们可以避免C语言那种繁琐的输入格式,比如在输入一个数值时,还需指定其格式,而cin以及cout则不需要。但是cin也有一些缺陷,比如当输入字符串时,遇到空格便截止,举个例子,如下,我们在输入“12 23.5 aa bb cc dd”,希望打印出的是前两个数值以及后面一个字符串“aa bb cc dd”,但实际打印出来的只有前两个数字和“aa”。
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int a; 6 double b; 7 string buf; 8 cin>>a>>b>>buf; 9 //读入字符串时遇到空格则止 12 23.5 aa bb cc dd 10 11 cout<<a<<endl; 12 cout<<b<<endl; 13 cout<<buf<<endl; 14 return 0; 15 } 16
为了解决诸多如此类的问题,于是C++提供了cin不可或缺的成员函数。具体用法及区别一一列举如下。
1.char get() 读入一个字符并返回(包括回车;tab;空格等空白字符)
示例1:
1 int main() 2 { 3 char ch; 4 5 //EOF为文件结束符,在windows系统下,用ctrl+z输入EOF,在linux环境下为ctrl+d 6 while((ch = cin.get()) != EOF) 7 cout<<ch; 8 return 0; 9 }
注意:此程序在运行后,可以在键盘上任意输入,屏幕将显示输入的所有内容,当输入文件结束符时,退出程序。(所有示例应包含<iostream>头文件,并且使用命名空间std,此处略,详见说明部分程序。下同)
2.istream& get(char&) 读入一个字符,读取成功返回非0,读取失败(比如遇到文件结束符)返回0值
示例2:
1 int main() 2 { 3 char ch; 4 5 //get函数返回的是istream&,可实现链式编程 6 while(cin.get(ch)) 7 cout.put(ch); 8 return 0; 9 }
3. istream& get(char *, int ,char )
istream& get(字符指针,字符个数 n,终止字符)
功能:从输入流中读取n-1字符,赋给字符数组或字符指针所指向的数组。如果在读取n-1个字符之前遇到终止字符,则提前结束。如果成功则返回非0,失败则返回0。会清空char*指向的空间,未读到n-1个字符或中止符,则会阻塞。不会越过中止符。在讲这个成员函数之前,先说几个简单的cin的其他成员函数,以便于更好地阐述这个函数:
a.istream& ignore(streamsize n = 1, int delim= EOF);
功能:从当前指针位置开始,忽略n个字节字符,直到遇到delim停止,默认参数为忽略一个字节
b.int peek()
功能:用来查看当前指针所在位置,用完当前指针位置不发生变化。
c.istream& putback (char c);
功能:往当前指针位置插入一个char c;
示例3:
1 int main() 2 { 3 char ch[20]; 4 5 //键盘输入i like c/i like c++ also/ 6 cin.get(ch,20,'/'); 7 cout<<"the first part is:"<<ch<<endl<<endl; 8 9 //查看当前指针所在位置 10 char peek = cin.peek(); 11 cout<<"the peek is:"<<peek<<endl<<endl; 12 13 //忽略'/'这个字符 14 cin.ignore(1,'/'); 15 //往当前指针位置插入一个char 16 cin.putback('a'); 17 18 peek = cin.peek(); 19 cout<<"the peek is:"<<peek<<endl<<endl; 20 21 cin.get(ch,20,'/'); 22 peek = cin.peek(); 23 cout<<"the second part is:"<<ch<<endl<<endl; 24 cout<<"the peek is:"<<peek<<endl<<endl; 25 return 0; 26 }
程序运行结果:
4.istream& getline(char *p, int n, char c)
cin.getline(字符数组或字符指针,字符个数 n,[终止字符])
功能:与带三个参数的get()功能类似,从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。如果在读取n-1个字符之前遇到终止字符(如果不写,默认为’\n’),则提前结束。会清空char*指向的空间,未读到n-1个字符或中止符,则会阻塞,会越过中止符。
示例3:
1 int main() 2 { 3 char str[1024];
4 //此处输入同上,为i like c/i like c++ also/ 5 //输入20个字符,遇到'/'截止,会越过终止符,不需手动忽略, 6 //如果不写终止符,默认为'\n'
7 cin.getline(str,10,'/'); 8 cout<<str<<endl; 9 cin.getline(str,10,'/'); 10 cout<<str<<endl; 11 return 0; 12 }
程序运行结果:
需要注意的是:
get和getline最大的区别就是,get遇到界定符时,停止执行,但并不从流中提取界定符,再次调用会遇到同一个界定符,函数将立即返回,不会提取输入。getline则不同,它将从输入流中提取界定符,但伤然不会把它放到缓冲区中。简单来说就是前者不会自动忽略界定符,而后者会。
5.ostream put(char p)
功能:输出一个字符,返回值为ostream类型,可实现链式编程
示例:
1 int main() 2 { 3 char str[] = "programming with with C++"; 4 for(unsigned int i = 0;i <sizeof(str)/sizeof(str[0]);i++) 5 { 6 //输出一个字符,返回类型为ostream,以实现再次调用(如下) 7 cout.put(str[i]).put('x'); 8 } 9 return 0; 10 }
程序运行结果:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。