文件流(fstream/ifstream/ofstream)作为类成员变量的初始化方式

文件流介绍

在标准模板库中,常见的文件流对象有fstream、ifstream、ofstream三种,我们可以用文件流的方式去操作文件,比如写文件和读文件,文件流类继承图如下:
这里写图片描述

ifstream继承于istream,实现高层文件流输入(input)操作,它能读取文件中的数据到变量,可以用于读文件,其默认的openmode是in。

ofstream继承于ostream,实现高层文件流输出(output)操作,它将数据信息写入到文件,可以用于写文件,其默认的openmode是out。

fstream继承于iostream,实现高层文件流输出(output)/输出(input)操作,它能实现文件的读写功能,是何种功能取决于openmode的组合。

openmode取值及功能如下:
这里写图片描述

文件流初始化

当文件流是句部变量时,其初始化方式如下:

//方式一:
std::fstream fs("test.txt", std::ios::in);
//方式二:
std::fstream fs;
fs.open("test.txt", std::ios::in);

当文件流作为类成员时,其初始化只能是初始化列表方式,即构造对象时文件,不能在构造函数体中进行操作,否则文件打开失败。

文件操作时的两个注意事项:

  1. 判断文件流是否正确打开,调用is_open()
  2. 析构前确保断开文件流和文件的关联,调用close()

文件流应用demo

#include <string>
#include <fstream>
#include <iostream>

class CWriter
{
public:
    //初始化列表方式
    CWriter(const std::string &strPath,
        std::ios_base::openmode mode=std::ios::out|std::ios::trunc):
    m_path(strPath),
    m_file(strPath.c_str())
    {

    }

    //初始化列表方式
    CWriter(const char* pPath,
        std::ios_base::openmode mode=std::ios::out|std::ios::trunc):
    m_path(pPath),
    m_file(pPath)
    {

    }

    ~CWriter()
    {    
        //析构时关闭文件流
        if (is_file_open())
        {
            m_file.close();
        }
    }

    bool is_file_open()
    {
        return m_file.is_open();
    }

    std::string GetPath()
    {
        return m_path;
    }

    void AddLog(const char* pMsg)
    {
        m_file << pMsg << "\n";
    }

private:
    std::string      m_path;    
    std::fstream     m_file; 
};

测试代码:

int main()
{
    CWriter file("test.txt");
    std::cout << file.GetPath() << "\n";

    if (file.is_file_open())
    {
        std::cout << "file open ok\n";
    }
    else
    {
        std::cout << "file open error\n";
        return -1;
    }

    file.AddLog("1234");
    file.AddLog("1234");
    return 0;
}

运行结果:
当前目录下新生成test.txt文件,其内容是如下:

1234
1234

参考资料:
https://stackoverflow.com/questions/20720271/ifstream-variable-in-class

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值