首页 > 编程语言 >C++中IO封装

C++中IO封装

时间:2022-12-31 17:45:39浏览次数:36  
标签:std 封装 buffer void C++ int IO buf size

之前在写一个分布式计算小项目时,频繁地使用文件IO,为简化代码,减少重复操作,降低出错可能性,便将I/O模块进行封装。

当时我的需求是对大文本文件进行读写,而且该文本文件是规整的,如:

标签 特征1 特征2 特征3
1 3.4 2.2 1
0 1.1 0.7 4

所以,遇到新需求时还需改写,这是这个模块还需改进的地方。

为了提升自己英文读写能力,部分代码注释使用英文,不知道几年之后,自己看着这蹩脚英语是啥感受!

1. 底层设计

对底层文件的(此处指文本文件)操作应该有3种,分别是读、写、追加操作,所以,我们可以用enum声明操作方式:

enum class FileOpenMode:int
{
    Write = 0,
    Read = 1,
    Append = 2
};

应对当时的需求,只完成了对应功能,后续功能再有需求时完善。

class FileOperator
{
public:
    FileOperator(const std::string& path, FileOpenMode mode);
    ~FileOperator();

    void Write(const void *buf, size_t size);
    
    /*
        * @param buf pointer to a memory buffer
        * @param size data size
        * @return the true size of data
        */
    inline size_t Read(void *buf, size_t size);

    //void Append(const void *buf, size_t size);

    inline bool Good();

private:
    bool is_good_;
    FILE *fp_;
    std::string path_;
};

对应的函数实现较为简单。实现代码附在文章末尾。

2. 中间层

用一个TextReader来封装对文本文件的操作。由于文件很大,将整个文件一次读入内存,无法实现,也不必要,所以每次读写一部分数据,因此,TextReader的关键成员变量就应为文件名、缓冲区大小(每次读入多少数据)。

class TextReader
{
public:
    TextReader(const std::string &path, size_t buf_size = 1024);
    ~TextReader();
    size_t GetLine(std::string &line);
private:
    size_t LoadBuffer();
    char* buf_;
    size_t pos_, buf_size_, length_;
    FileOperator* op_;
};

其中,构造函数与析构函数的设计实现较为简单,析构函数附在文末。

TextReader::TextReader(const std::string &path, size_t buf_size)
{
    stream_ = new LocalStream(path, FileOpenMode::Read);
    buf_size_ = buf_size;
    pos_ = length_ = 0;
    buf_ = new char[buf_size_];
}

根据需求,我们按行读取文件,通过调用GetLine函数,读取每一行数据,我个人不太喜欢指针,所以,利用string类的引用传递数据。

其中length_buf_种实际的数据长度,pos_指外部读取每行时,读取到了哪个位置。当读取到换行符时或文件已经全部读取完成即可跳出外层循环并返回,否则需要读取一个数据。在读取一个数据时,我们可能会遇到当前buf_的内容已全部被读取的情况,即内层while循环跳出,此时就需重新loadBuffer(访问文件)。

size_t TextReader::GetLine(std::string &line)
{
    line.clear();
    bool isEnd = false;
    while (!isEnd)
    {
        while (pos_ < length_)
        {
            char &c = buf_[pos_++];
            if (c == '\n')
            {
                isEnd = true;
                break;
            }
            else
            {
                line += c;
            }
        }
        if (isEnd || LoadBuffer() == 0)
            break;
    }
    return line.size();
}

size_t TextReader::LoadBuffer()
{
    pos_ = length_ = 0;
    return length_ = stream_->Read(buf_, buf_size_ - 1);
}

3.顶层设计

这一层,可以根据实际需求改动。为了节省内存空间,同时提高CPU利用率,我们读一部分数据,处理一部分数据,在CPU处理数据的时候,可以继续读文件,这样可以保证CPU一直运转。所以,我们考虑多线程的设计。

一些关键部分用中文描述,怕之后连自己都看不懂

标签:std,封装,buffer,void,C++,int,IO,buf,size
From: https://www.cnblogs.com/caieleven/p/17017021.html

相关文章

  • TCP IP网络编程 IO分离
    IO流分离  在《套接字与标准IO》中介绍,调用fopen函数打开文件后,可以与文件进行交换数据。因此可以说调用fopen函数之后创建了"流(stream)",此处的"指"数据流动,但是通常......
  • macOS 终端运行提示“Operation not permitted ”解决办法
    终端运行命令后提“示Operationnotpermitted”报错,这个问题一般只有在macOSVentura系统出现比较频繁,或者是从其他版本升级到Ventura的也需要注意这个小问题。解决办法打......
  • 【win编程】- 在C/C++中调用obj文件
    问题思考:有没有一种方式,让别人用你源码实现的功能,只给你声明,不给你源码?程序编译过程:预编译-编译-链接,编译生成obj文件,最后链接生成可执行文件。那么就可以把源码......
  • How to Maintain Insertion Order of the Elements in Java HashMap?
    https://www.geeksforgeeks.org/how-to-maintain-insertion-order-of-the-elements-in-java-hashmap/ Whenelementsgetfromthe HashMap duetohashingtheorder......
  • visual studio code设置setting.json文件
    #原始设置{"editor.unicodeHighlight.nonBasicASCII":false,"editor.unicodeHighlight.ambiguousCharacters":false,"workbench.preferredDarkColorTh......
  • NioEndpoint_tomcat压测瓶颈
    示意图简述1. tomcat开启端口,通过backlog觉得TCP半连接、全连接的大小。ssl-lnt2. Nioendpoint通过maxConnectlatch控制accept接入通道连接的大小3. ......
  • Region 区域
    一、定义XML区域:1.1使用XML设置区域名称<ContentControlprism:RegionManager.RegionName="ContentRegion"/>1.2使用代码设置区域名称<ContentControlx:Na......
  • Mohamed Elfeki-2019-GDPP Learning Diverse Generations Using Determinantal Point
    GDPP:LearningDiverseGenerationsUsingDeterminantalPointProcess#paper1.paper-info1.1MetadataAuthor::[[MohamedElfeki]],[[CamilleCouprie]],[[M......
  • C++图书收藏模拟系统[2022-12-31]
    C++图书收藏模拟系统[2022-12-31]课题名称:图书收藏模拟系统的设计与实现课题简介目前有一些著名的网上图书购买系统,比如当当网、亚马逊等,他们都有收藏和购买图书的功......
  • EasyClick IOS 脱机版脚本自动化测试工具发布
    官方文档地址:​​https://ieasyclick.com/iostjdocs​​开发工具:ideaiOS脱机版本产品介绍苹果手机免越狱免硬件自动化脚本编程软件,适合游戏自动化、办公自动化、自动化......