二进制文件的IO操作

二进制文件的IO操作

习惯上,把非文本文件叫做二进制文件,实际上,所有的文件都是按照二进制存储 的。文本文件中存放的大部分是可见字符,加

上少许控制字符;而二进制文件则可以包含任何字符和数据。二进制文件的输入输出不能用插入和提取操作符(<<和>>操作符)来

实现,因为它们是为文本文件准备的。 对于二进制文件,必须使用read()和write()函数来读取和写入。

创建一个二进制文件:ofstream fout("file.dat", ios::binary)

将一个整数写入文件:int number = 30;  fout.write((char *)(&number), sizeof(number))

使用二进制文件的好处是可以一次把一个结构写入文件,大大提高了数据的存储效率,而如果使用的是文本文件存储结构,你就

不得不打结构的数据成员一个一个地写入文件。

读取二进制文件的内容: ifstream fin("file.dat", ios::binary);  fin.read((char *)(&obj), sizeof(obj));

默认地,文件以ASCII方式打开,不存在则创建,存在就覆盖。

一些标志:

ios::app   添加到文件尾

ios::ate    把文件标志放在末尾而非起始

ios::trunc  默认,截断并覆写文件

ios::nocreate    文件不存在也不创建

ios::noreplace   文件存在则失败

ios::binary  以二进制形式打开文件

一个重要的类:ios_base

ios_base是C++标准程序库中的一个类,定义于<ios>头文件中。ios_base类封装了C++标准中的流输入输出中不依赖于读写的

数据的类型的基本信息,如格式化信息、异常状态、事件回调函数等。

C++程序设计时,一般不会直接调用std::ios_base的成员函数,但是会经常用到该类中定义的各种流的数据格式的枚举值常

量。如ios_base::hex、ios_base::skipws等等。

在类std::ios_base中,保存了下述关于流的信息:

  • 格式控制信息的枚举类型fmtflags ,影响到如何解释输入串行的格式、如何生成输出串行的格式,例如整数是16进制还

         是10进制表示,浮点数是科学计数法还是定点形式等;

  • 流的状态的枚举类型iostate,如数据是否完整、是否到达流的末尾、是否读写失败等;
  • 流的打开方式的枚举类型openmode,如读取、写入、追加、创建时删除原内容、二进制打开、
  • 流的定位位置的枚举类型seekdir,如开始位置、当前位置、结尾位置等。
  • 流的事件的枚举类型event,如“擦除”事件erase_event,改变locale设置事件imbue_event,复制格式事件   copyfmt_event。
  • 流的私用的其它额外保存的数据,为一个long型数组与一个指针数组。
  • 一个成员类failure,用于作为C++标准中的流输入输出类库抛出的各种异常的基类。
  • 一个成员类Init,用于封装cout、cin、wcout等8个静态对象的初始化函数。

ios 和ios_base 有什么不同?

ios是basic_ios的模板实现,而basic_ios继承了ios_base, 所以经常有这样的写法 ios::in, ios_base::in 其实效果是一样的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值