1.输入/输出流(I/O流)
在C++中定义了通过输入/输出流(I/O流)的方法进行输入输出操作。在I/O流中,输入操作是通过cin 来实现的,而输出操作是通过cout来实现的。cin 和cout都是在头文件iostream中定义的,所以在程序中首先要包含输入/输出流的头文件,即#include<iostream>。
cout语句的一般格式为:
cout<<表达式1<<表达式2<<……<<表达式n;
cin语句的一般格式为:
cin>>变量1>>变量2>>……>>变量n;
在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'
',ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。
一个cout语句可以分写成若干行。如
cout<<"a+b=c"<<endl;
可以写成
cout<<"a+b= " //注意行末尾无分号
<<"c "
<<endl; //语句最后有分号
均输出:a+b=c
注意 不能用一个插入运算符“<<”插入多个输出项,如:
cout<<a,b,c; //错误,不能一次插入多项
cout<<a+b+c; //正确,这是一个表达式,作为一项
在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则
cout<<a<<' '<<b<<' '<<c<<endl;
会以下面的形式输出:
4 345.789 a
与cout类似,一个cin语句可以分写成若干行。如
cin>>a>>b>>c>>d;
可以写成
cin>>a //注意行末尾无分号
>>b //这样写可能看起来清晰些
>>c
>>d;
均可以从键盘输入: 1 2 3 4 ↙
在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有
char c1,c2;
int a;
float b;
cin>>c1>>c2>>a>>b;
注意: 不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以用getchar函数。
在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。
关于endl的用法
在c++中,终端输出换行时,用cout<<......<<endl与 “ ”都可以,这是初级的认识。但二者有小小的区别,用endl时会刷新缓冲区,使得栈中的东西刷新一次,但用“ ”不会刷新,它只会换行,栈内数据没有变化。
cout << endl;除了往输出流中插入一个' ',还有刷新输出流的作用。
cout <<endl; 等价于: cout<< ' ' << flush;
2. 在输入流与输出流中使用控制符
I/O流的常用控制符
![](https://img2020.cnblogs.com/blog/1861334/202010/1861334-20201004194445004-1167662391.png)
需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。
以下通过例子进行说明:
【实例一】
#include<iostream> using namespace std; #include<iomanip> int main() { int i, j; cout << "please input two numbers:"; cin >> i >> j; cout << i << j<<endl; cout << setw(10) << i << setw(10) << j << endl; system("pause"); return 0; }
在该例中,第一个cout没有指定的宽度,而第二个cout中由于setw(10)指明i和j输出时占用字符的宽度为10,前面有8个空格。
如果将例子中cout << setw(10) << i << setw(10) << j << endl;改为如下
cout <<setfill('*')<< setw(10) << i << setw(10) << j << endl;
其输出结果为如图
【实例二】
include<iostream> #include<iomanip> using namespace std; int main() { const double pi = 3.14159; double r = 6.779, c, s; c = 2.0*pi*r;//计算周长 s = pi * r*r;//计算面积 cout << "r的值" << r << endl; cout << "圆的周长(指数形式)" << setiosflags(ios::scientific) << c << endl; cout << "圆的面积(指数形式)" <<s<< endl; cout << "圆的周长(小数形式)" << dec << setiosflags(ios::fixed) << c << endl; cout << "圆的面积(小数形式)" << dec << setiosflags(ios::fixed) << s << endl; system("pause"); return 0; }
【实例三】
#include <iostream> #include <iomanip> using namespace std; void testdouble() { double d1 = 12.345678901234567; cout << d1 << endl; } int main() { cout << "123456的十进制位:" << dec << 123456 << ",八进制为:" << oct << 123456 << ",十六进制为:" << hex << 123456 << 'n' << endl; //dec:返回数值的十进制,oct返回是指的八进制,hex返回数值的十六进制。 cout << dec; //恢复为十进制格式 cout << setfill('*') << setw(10) << setiosflags(ios::left) << 123456 << 'n' << endl; //setfill(c):设置字符填充,c可以是字符常或字符变量,只对本行有用。 // setw(n):设置字段宽度为n位,如果n小于所要返回的字符的宽度则保留字符原样输出,只对 //setiosflags(ios::left):左对齐,setiosflags(ios::right):右对齐 cout << resetiosflags(ios::left); //终止已设置的输入输出流格式,本例去掉左对齐方式 double d = 12.345678901234567; testdouble(); //之前没有使用输入输出流控制符,d1默认格式输出(精度为6) cout << setprecision(16) << d << endl; //设置浮点数的精度,n为有效数字,采用四则五入法舍位,setprecision(n)中,n小于等于16有效。 testdouble(); //之前使用了setprecision(),此函数保留前面的宽度设置。 cout << setiosflags(ios::fixed) << setprecision(17) << d << endl; //setiosflags(ios::fixed):设置浮点数以固定的小数位数显示,8为8位小数,所指定的小数位如果大于小数本身小数位则补0。 cout << resetiosflags(ios::fixed); cout << setiosflags(ios::scientific) << setiosflags(ios::uppercase) << setprecision(4) << d << 'n' << endl; // setiosflags(ios::scietific):用科学计数法表示,4为指定小数位分为四位,且第四位四舍五入。 //setiosflags(ios::uppercase) : 在以科学计数法输出E与十六进制输出X以大写输出,否则小写。 system("pause"); return 0; }
3. 六个输入函数用法
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VS2017运行)
1. cin
2. cin.get()
3. cin.getline()
4. getline()
5. gets()
3.1 cin>>
不做过多的说明,在文章开始已经有相关的解说。
3.2cin.get()
用法1: cin.get(字符变量名)可以用来接收字符
#include <iostream> using namespace std; int main() { char a; a = cin.get(); //或者cin.get(ch); cout << a << endl; system("pause"); return 0; }
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include <iostream> using namespace std; int main() { char a[10]; cin.get(a,20); //或者cin.get(ch); cout << a << endl; system("pause"); return 0; }
用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足
#include <iostream> using namespace std; int main() { char a; cin.get(); //或者cin.get(ch); cin >> a; cout << a << endl; system("pause"); return 0; }
3.3 cin.getline()
接受一个字符串,可以接收空格并输出
#include <iostream> using namespace std; int main() { char m[20]; cin.getline(m, 5); cout << m << endl; system("pause"); return 0; }
接受5个字符到m中,其中最后一个为' ',所以只看到4个字符输出;
当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:
#include <iostream> using namespace std; int main() { char m[3][20]; for (int i = 0; i < 3; i++) { cout << " 请输入第" << i + 1 << "个字符串:" << endl; cin.getline(m[i], 20); } cout << endl; for (int j = 0; j < 3; j++) cout << "输出m[" << j << "]的值:" << m[j] << endl; system("pause"); return 0; }
3.4 getline()
接受一个字符串,可以接收空格并输出,需包含“#include<string>”
#include <iostream>
#include<string> using namespace std; int main() { string str; getline(cin, str); cout << str << endl; system("pause"); return 0; }
和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数
3.5 gets()
在VS新标准中,应该是用gets_s代替gets
接受一个字符串,可以接收空格并输出,需包含“#include<string>”
#include <iostream> #include<string> using namespace std; int main() { char m[20]; gets_s(m); //不能写成m=gets_s(); cout << m << endl; system("pause"); return 0; }
类似cin.getline()里面的一个例子,gets()同样可以用在多维数组里面:
#include <iostream> #include<string> using namespace std; int main() { char m[3][20]; for (int i = 0; i < 3; i++) { cout << " 请输入第" << i + 1 << "个字符串:" << endl; gets_s(m[i]); } cout << endl; for (int j = 0; j < 3; j++) cout << "输出m[" << j << "]的值:" << m[j] << endl; system("pause"); return 0; }
自我感觉gets()和cin.getline()的用法很类似,只不过cin.getline()多一个参数罢了;cin.getline()和gets()均可以接收空格
3.6 getchar()
接受一个字符,需包含“#include<string>”
#include <iostream> #include<string> using namespace std; int main() { char ch; ch = getchar(); //不能写成getchar(ch); cout << ch << endl; system("pause"); return 0; }
getchar()是C语言的函数,C++也可以兼容,但是尽量不用或少用;