c++ CFile 类的封装

        记得以前去一家叫什么鸿泉xx公司面试,给了一张面试题要答,题目基本不记得了,但有一题印象特别深刻,就是叫你写一个CFile类,并且提供像 open(), close(), seek(), load(), unload(), getPosition() 等函数,其实就是封装库函数,但要在纸上写这些函数的封装确实不容易,这又不像我们在PC上随便写写改改。而且还有一个更搞笑的是,还要答一个自我打分表,各个表项包含到你的生活,你的性格,你的为人处事,等等。所以当时根本就没答那个CFile类题目,因为那些代码我也有,哈哈。

        下面的例子就是使用了 CFile 类(源码这里不便展示,有需要的可以咨询)的:

#include "File.h"
#include "Log.h"
#include 
#include 

using namespace ECI::Infra;
bool readFile(const char *fileName);

int main(int argc, char *argv[])
{
    if(argc != 2) {
        printf("Usage: %s file\n", argv[0]);
        return -1;
    }

    readFile(argv[1]);
    return 0;
}

bool readFile(const char *fileName)
{
    CFile file;
    file.open(fileName, CFile::modeRead);
    
    size_t fileLen = file.getLength();

    char buf[4] = {0};
    size_t ret = 0;
    size_t readSize = 0;
    size_t totalLine = 0;
    size_t curPos = 0;
    size_t tempPos = 0;
    size_t curLineLen = 0;
    while(fileLen - readSize > 0)
    {
        if((ret = file.read(buf, 1)) != 0)
        {
            readSize += ret;

            //寻找换行符
            if(strcmp(buf, "\n") == 0)
            {
                //先保存上一行末尾的位置
                tempPos = curPos;
                curPos = file.getPosition();
                totalLine++;

                // 前后两个位置差就是该行的长度了
                curLineLen = curPos - tempPos;
                
                {
                    // 往前移动整行长度进行读取
                    file.seek(-(curLineLen), CFile::current);
                    std::shared_ptr ptr(new char[curLineLen], std::default_delete());
                    memset(ptr.get(), 0, curLineLen);
                    file.read(ptr.get(), curLineLen);
                    std::string str(ptr.get(), curLineLen);
                    printf("line %lu: %s\n", totalLine, str.c_str());
                }

                //打印前17行测试
                if(totalLine == 17) break;
            }
            memset(buf, 0, sizeof(buf));
        }
    }

    // printf("file total line: %lu\n", totalLine);

    return true;
}

这个例子主要实现的功能是:一行行打印文件数据。

c++ CFile 类的封装_第1张图片

文件 new_opa.html 是这样的:

c++ CFile 类的封装_第2张图片

按行打印其实并不是我的最终目的,我的目的是想提取这个html文档里的源码。因为前两天我在找new的源码的时候需要去git下载,本来是想下载整个源码包,奈何下载速度太慢了,但单个目标文件又好像无法下载。当我在Centos7上用 wget https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_opa.cc 下载的时候,我以为下载后就是.cc 源码文件,结果是整个html页面,而里面就是包含源码的,我的最终目的是想把里面的源码取出来。就像这样,想要取的就是红框里的那些包含注释的源码。网上有一些用c++写解析html文件的开源库,不知道是否可以实现这个需求,目前还没用过。

c++ CFile 类的封装_第3张图片 

 

 

你可能感兴趣的:(#,C++类/结构体,c++)