C++流


C++输入输出流概述

是有方向的字节序列

  • 流向内存的数据称为输入流

  • 流出内存的数据称为输出流

image-20210529162855302

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;

image-20210529165608991


// 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;

image-20210529171254158

注意: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;

image-20210529171706787

注意: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;

image-20210529185235148

注意: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);

image-20210529190607019

C++输入输出总结

  1. 不涉及空格、tab、回车字符串的输入以及所有的数字输入用>>
  2. 输入一个字符的时候可以用>>或者用get方法
  3. 输入一行字符的时候用get、getline或者read方法
  4. 输出用<<或者write

文章作者: dyl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dyl !
 上一篇
C++异常处理 C++异常处理
异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,通过异常处理,对用户非法操作进行控制和提示
2023-12-10 dyl
下一篇 
C++多态 C++多态
C++三大特性封装、继承、多态,该文讲解C++多态实现以及基本原理讲解,代码比较抽象,可以配合图来理解,重点是要搞懂虚函数列表的问题
2023-12-10 dyl
  目录