c++的io流

C++系统实现了一个庞大的类库,其以ios_base为基类,其他类都是直接或间接派生自ios_base类
在这里插入图片描述

c++标准io流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,其中cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象基本没有区别,只是应用场景不同。
需要注意的是:

  1. cin为缓冲流。键盘输入的数据会保存在缓冲区中,当要提取时,cin从缓冲区中拿数据,只有把输入缓冲区中的数据取完后,才要求输入新的数据。

  2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。

  3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。

  4. cin和cout可以直接输入和输出内置类型数据,这是因为标准库已经将所有内置类型的输入和输出全部重载了。

  5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。

  6. istream类型对象可以转换为逻辑条件判断值
    实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是重载函数operator>>,返回值是istream类型的对象,其可以做逻辑条件值源自于istream的对象又调用了operator bool函数,operator bool调用时如果接收流失败或者接收到结束标志则返回false。
    因此只要一个类重载了operator bool()函数,该类实例化出的对象就可以充当逻辑条件判断值。

c++文件io流

C++根据文件内容的数据格式分为二进制文件和文本文件,打开一个文件的格式为:
文件流对象(文件名,打开方式)

文件的常见打开方式有:
ios::in 读文件
ios::out 写文件(直接用的话会丢丢弃已有数据,即隐含为trunc)
ios::binary 二进制方式
ios:app 追加写(要配合out使用,直接写的话会隐含用ios::out)
ios::trunc 覆盖写(要配合out使用)
ios::out|ios::binary 二进制写

需要注意数据的输入输出是以内存为参考系的,而不是文件。
文件流类型有:
ifstream :只输入用,默认打开方式为ios::in,不应使用与输出相关的打开方式
ofstream :只输出用,默认打开方式为ios::out,不应使用与输入相关的打开方式
fstream:既输入又输出用,不会默认指定打开方式

采用文件流对象操作文件的一般步
骤:

  1. 定义一个文件流对象
  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数对文件进行读写
  4. 关闭文件

对于内置类型,用户既可以使用文件流对象的内置函数读写文件,也可以使用流插入和流提取。

对于自定义类型,只要用户自定义的类重载了>>和<<:

istream& operator >> (istream& in, ClassName& d)
ostream& operator << (ostream& out, const ClassName& d)

或者写了相关的读写函数,那么用户就可以以与自定义类型同样的方式对自定义类型数据进行文件读写。

c++字符流转换

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,可以这样做:

  1. 使用itoa()函数
  2. 使用sprintf()函数

但是两个函数在转化时,都得需要先给出保存结果的空间,这不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
在C++中,可以使用stringstream类对象来避开此问题,在程序中如果想要使用stringstream,需要包含头文件<sstream>。在该头文件下,包含三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。
其中stringstream主要可以用来:

  1. 将数值类型数据格式化为字符串
  2. 字符串拼接
  3. 序列化和反序列化结构数据

需要注意的是:

  1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
  2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
  3. 可以使用s. str(“”)方法将底层string对象设置为""空字符串。
  4. 可以使用s.str()将让stringstream返回其底层的string对象。
  5. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。
  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值