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(或'\n',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与 “\n”都可以,这是初级的认识。但二者有小小的区别,用endl时会刷新缓冲区,使得栈中的东西刷新一次,但用“\n”不会刷新,它只会换行,栈内数据没有变化。
cout << endl;除了往输出流中插入一个'\n',还有刷新输出流的作用。
cout <<endl; 等价于: cout<< '\n' << flush;
2. 在输入流与输出流中使用控制符
I/O流的常用控制符
需要注意的是:如果使用了控制符,在程序单位的开头除了要加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()
6. getchar()
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中,其中最后一个为'\0',所以只看到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 << "\n请输入第" << 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 << "\n请输入第" << 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++也可以兼容,但是尽量不用或少用;