第四十六篇,C++中的文件IO函数,类型转换与智能指针

文件IO
=====================================================
   1.涉及到的类
        #include <fstream> 
        ifstream  --》读取文件
        ofstream  --》写入文件

   2.读取文件
       第一步:定义ifstream类的对象
                     ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
                             参数:filename --》文件路径名
                                   mode --》权限  ios_base::in  可读              
                                                  ios_base::out 可写
       第二步:打开文件,如果文件不存在,打开会失败
                     void open(const char* filename,ios_base::openmode mode = ios_base::in);
       第三步:读取文件
                     get()   //一次读取一个字符
                          int get();
                     read()  //读取指定数量的字符
                          istream& read (char* s, streamsize n);
                                  参数:s --》存放读取的内容
                                        n --》你打算读取多少字节数据
                     getline() //一次最多只能读取一行内容,类似于fgets()
                          istream& getline (char* s, streamsize n);
                          istream& getline (char* s, streamsize n, char delim);
                                  参数:delim --》默认情况下getline遇到\n结束读取
                                                  这个参数可以指定getline遇到特定字符结束读取
       第四步:关闭文件
                    void close();

   3.写入文件
      第一步:定义ofstream类的对象
                    ofstream (const char* filename, ios_base::openmode mode = ios_base::out);
      第二步:打开文件,如果文件不存在,可以新建
                    void open(const char* filename,  ios_base::openmode mode = ios_base::out);
      第三步:写入文件
                    ostream& write (const char* s, streamsize n);
      第四步:关闭文件
                    void close();


类型转换
=====================================================
   1.C语言只有一种粗暴的转换方式---》强制类型转换
   
   2.C++新增四种常见的类型转换方式
         以下四种类型转换,都是模板函数

         第一种:dynamic_cast  //用于父类指针指向子类对象的转换(多态)(本来可以自动转换,不需要使用这个函数,但是规范写法还是写上)
                 父类 *p=dynamic_cast<父类 *>(子类指针);


         第二种:const_cast    //用于把一个const修改的指针,赋值给一个非const修饰的指针
                    People people1;
                const People *p=&people1;
                //People *q=p; 编译语法错误
                People *q=const_cast<People *>(p); 

         第三种:static_cast  //子类指针指向父类的转换
                    static_cast<类型1>(类型2)  

         第四种:reinterpret_cast //强制转换  


智能指针
=====================================================
   1.概念
       为了解决堆空间自动释放这个问题,发明了智能指针
       实际开发中总有程序员忘记释放堆空间 

   2.智能指针的原理
       所谓的智能指针,本质上是个模板类
       使用智能指针,只需要创建模板类的对象即可(对象创建自动调用构造--》分配的堆空间 对象释放自动调用析构--》释放堆空间)
       程序员就不必烦恼堆空间的申请和释放问题
       template<typename T>
       class xxxx  //模板类--》可以匹配任何合法类型
       {
         public:
               构造函数
               {
                   给指针分配堆空间
               }
               析构函数
               {
                   给指针释放堆空间
               }
         private:
               T *指针;
       };

       xxxx<int> 对象; //对象本身并不是指针

   3.常见的智能指针
       C++11之前:
               auto_ptr --》智能指针(模板类的名字)
       C++11以后:
               unique_ptr --》智能指针(模板类的名字)   
               头文件 #include <memory>
                       公式: unique_ptr<模板类型>  对象();
                       例如: unique_ptr<int> p(new int);  //分配一个int,p本身不是指针,是类的对象
                                  *p=666;
                          unique_ptr<int[]> p(new int[10]);
                          p[0]=15;
                          p[1]=56;
                          p[2]=89;
                       注意:如果是申请一个int大小,使用的使用采用解引用
                             如果是申请多个int大小,使用的使用采用中括号

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖爱Kun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值