C++输入输出流概述
流是有方向的字节序列
流向内存的数据称为输入流
流出内存的数据称为输出流
流类
ios类及其派生类:输入和输出
流实体 | cin | cout | cerr | clog |
---|---|---|---|---|
所属类 | istream | ostream | ostream | ostream |
说明 | 标准输入流实体 | 标准输出流实体 | 标准错误输出流实体 | 标准错误输出流实体 |
源/目标 | 键盘 | 显示器,可以重定向到文件 | 显示器 | 显示器 |
能否缓冲 | 不能 | 默认不使用,可以使用stdout缓冲区 | 不能 | 默认不使用,可以使用stderr缓冲区 |
ostream类
// 运算符<<重载
ostream & operator<<(int n);
ostream & operator<<(double d);
ostream & operator<<(char ch);
...
// <<输出运算支持拼接输出
cout<< "hello" << "world" <<endl;
// put方法
// 把一个字符写道输出流中
ostream & put(char ch); // cout.put('x');
// cout.put('a').put('b').put('c');
// write方法
// 从buffer指向的内存空间取出n个字节,输出到输出流中
ostream & write(char *buffer,int n); // char *buf="acd";
// cout.write(buf,2).write(buf,1);
istream类
// 运算符>>重载
istream & operator>>(int &val); // cin>>10; 错误
istream & operator>>(double &val);
istream & operator>>(char &val);
// 输入运算支持拼接输入 cin>>a>>b;
// cin>>接受数字和字符串,遇到空格、tab、回车结束
char a[10];
char b[10];
cin>>a;
cout<<"a:"<<a<<endl;
cin>>b;
cout<<"b:"<<b<<endl;
// get方法
// get可以接受空格和制表符,只把回车符作为终止符,而>>将空格、制表符和回车符都作为终止符
char get(); //从输入流实体中提取一个字符,作为返回值,该返回值可以是空格也可以是制表符也可以是回车符
istream & get(char &ch); //从输入流实体中提取一个字符,作为返回值,该返回值可以是空格也可以是制表符也可以是回车符
istream & get(char *buffer,int n,char ch='\n'); //从输入流实体中读取n-1个字符,或者遇到第三个参数指定的终止符,并补上'\0'字符,存放在buffer指针指向的内存空间中
char a[10];
char b[10];
cin.get(a,10);
cout<<"a:"<<a<<endl;
cin.get(b,10);
cout<<"b:"<<b<<endl;
注意:get遇到回车符终止,在输入的时候输入回车符终止,该回车符依然在输入缓冲区,当第二个输入get遇到了回车符直接终止了并没有等待输入,所以b里面就只有一个’\0’
char a[10];
char b[10];
cin.get(a,10).get();
cout<<"a:"<<a<<endl;
cin.get(b,10).get();
cout<<"b:"<<b<<endl;
注意:get()接收了回车符,以至于第二个get(b,10)没有遇到回车符,可以正常的等待用户输入,运行正常
// getline方法
istream & getline(char *buffer,int n,char ch='\n');
// 功能与get类似,从输入流实体中读取n-1个字符和1个'\0'字符,可以接受空格和制表符,只把回车符作为终止符,但在完成读取数据后,从读取的数据中删除该终止符
char a[10];
char b[10];
cin.getline(a,10);
cout<<"a:"<<a<<endl;
cin.getline(b,10);
cout<<"b:"<<b<<endl;
注意:cin.get(buffer,size)读取数据到buffer中,遇到’\n’结束,下一次的cin.get(buffer,size)遇到’\n’直接结束了读取,读到了空字符串;可以使用cin.get(buffer,size).get(),抛弃’\n’
cin.getline()每次读取一整行并抛弃’\n’
// read方法
istream & read(char *buffer,int n);
// 从输入流中读取n个字符,保存到buffer指向的内存空间中
注意:read和get、getline区别
- n个而非n-1个输入流中的字符,没有额外补’\0’;
- ‘\n’、空格、’\t’都会被当作有效字符读入;
- 必须读进n个字符,如果输入字符不够,则会等待输入;
- 不构成字符串,不能使用cout<<buffer输出,只能使用cout.write(buffer,n)输出
char a[10];
char b[10];
cin.read(a,10);
cout.write(a,10);
C++输入输出总结
- 不涉及空格、tab、回车字符串的输入以及所有的数字输入用>>
- 输入一个字符的时候可以用>>或者用get方法
- 输入一行字符的时候用get、getline或者read方法
- 输出用<<或者write