c语言ofstream未定义标识符,关于c++:c中ifstream及ofstream超详细说明

前文说过,ifstream是继承于istream,ofstream是继承于ostream,fstream是继承于iostream类,而他们应用的缓冲区类是filebuf。

对于这些类之间的关系,有趣味能够去查看我之前的文章:

c++规范输入输出流关系梳理

1. filebuf类介绍

filebuf类又比stringbuf类要简单一点,毕竟是对文件进行读写,首先在它的成员变量中找到了这样一条申明:

__file_type _M_file;

_M_file就是它外面的文件操作对象,那么探索一下__file_type到底是什么类型呢,通过跟代码发现它其实是一个类模板__basic_file的char实例,而__basic_file是围绕一个FILE类型的指针来进行操作的,而FILE这个类型大家其实就很相熟啦,它是c语言规范库外面操作文件的规范类型,个别是叫做文件指针,所以从这里就能够看出filebuf最终其实还是基于c语言的fopen等这一套文件操作函数去进行解决的。当然啦,在linux外面fopen其实又是基于它的零碎调用open函数来进行的,这个咱们晓得就好,就不再做开展啦。

当看到fopen的调用时,其实心田是挺惊喜的,因为fstream这一套货色以前也常常应用,然而呢,从来不晓得它的底层到底是怎么实现的,这次总算是晓得了一点。

1.1 filebuf类构造函数和析构函数

首先看一下filebuf的构造函数原型,如下:

//这里申明了一个无参构造函数

basic_filebuf();

#if __cplusplus >= 201103L

basic_filebuf(const basic_filebuf&) = delete;

//这里申明了一个入参为右值援用的挪动构造函数,所谓右值援用,它容许内容从一个filebuf对象挪动到另外一个filebuf对象,挪动实现当前,源filebuf对象将被销毁,不能再被应用,它没有产生任何拷贝的动作

basic_filebuf(basic_filebuf&&);

#endif

#if __cplusplus >= 201103L

basic_filebuf& operator=(const basic_filebuf&) = delete;

//同上,这里申明了一个挪动赋值函数

basic_filebuf& operator=(basic_filebuf&&);

#endif

//析构函数敞开文件

virtual

~basic_filebuf()

{ this->close(); }

小贴士:=delete是c++11的用法,在c++11以前要避免类对象被拷贝和赋值,就要把拷贝构造函数和赋值函数申明为private的,到了c++11就间接应用=delete来进行申明,它意味着这个函数不能被调用,否则编译就会报错。

从下面咱们能够看到filebuf类是不容许拷贝和赋值的,否则可能会产生多个对象操作同一个IO缓冲,就会导致诸多的问题,它只容许进行挪动,这样能保障任何时候同一个IO缓冲只有一个对象能够操作。

应用例子如下:

#include

using namespac

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值