C++知识碎片整理(5)——个人文件工具类

来源:互联网 发布:天津市网络教育平台 编辑:程序博客网 时间:2024/04/30 03:21

2016/8/16
因为个人科研学习需要,经常需要配合OpenCV进行大量的图像处理和分析,文件遍历,数据输入输出工作。因此自己在公做过程中写了一些常用的类,不怎么精细,也不健壮,但能用,并且会不断改善自己的工具类库。


为了清晰,将整个类分成几块来写

类的主体结构

class DirClass{public:    //类的内部变量    //文件夹内文件数    int nfileAmount;    //文件夹绝对路径    char* Path;    //构造器    DirClass(){        nfileAmount = 0;    }    DirClass(char* dir){        DirClass();        setPath(dir);    }    //获取文件夹内文件数    int getFileAmount(){ return nfileAmount; }    //获取文件夹绝对路径    char* getPath(){ return Path; }    //设置文件夹路径    bool setPath(char* dir);    //遍历数组返回文件夹内所有文件的绝对路径队列    list<string> traverseDir(string searchType);    // 写实数到文件夹中指定文件名和文件类型的文件中,如不存在这样的文件可以创建    void write(double writedata, char* writeFileName, char* writeFileType);    void write(string writedata, char* writeFileName, char* writeFileType);};

路径设置方法

因为经常在些路径的时候忘记最后一个“/”,所以设置了条件选择机制,把漏掉的自动补上。

//设置文件夹路径//@parameter dir char* 文件夹的路径,如"D:/folder/"bool DirClass::setPath(char* dir){    //如果目录的最后一个字母不是'/',则在最后加上一个'/'    int len = strlen(dir);    if (dir[len - 1] != '/'){        //char* temp = "/";        char* n_dir = new char[len + 1];//字符数组拼接必须先确定拼接后长度        strcpy(n_dir, dir);//复制字符数组        strcat(n_dir, "/");//拼接字符数组        Path = n_dir;//给绝对路径附正确的值    }    else{        Path = dir;    }    return true;}

文件遍历方法

输入是要遍历的文件类型,输出一个所有该文件类型文件的绝对路径List

//遍历数组返回文件夹内所有文件的绝对路径队列//@output traverseFile list<string> 遍历指定文件类型的绝对路径列表//@parameter searchType 要搜索的文件类型list<string> DirClass::traverseDir(string searchType){    list<string> output;//输出队列 队列适合动态的元素    int ID = 0;//文件计数    //参数准备    int len = strlen(Path);    char* dirChar = new char[len + 4];    strcpy(dirChar, Path);    strcat(dirChar, "/*.*");    const char* cdirChar = dirChar;    //文件遍历结构    _finddata_t fileDir;    long lfDir;    if ((lfDir = _findfirst(cdirChar, &fileDir)) == -1l)        printf("No file is found\n");    else{        //printf("file list:\n");        do{            //printf("%s\n", fileDir.name);            String fileName = fileDir.name;            int length = fileName.size();            int typeLength = searchType.size();            String fileType = fileName.substr(length - typeLength, length);//获取文件名最后几位,即后缀            //printf("%s\n", fileType);            fileType = fileType.toLowerCase();            transform(searchType.begin(), searchType.end(), searchType.begin(), tolower);            if (fileType == searchType){                //printf("%s\n", fileName);                std::string str = fileName.operator std::string();//CV的String类转std String类                str = Path + str;//组装完整文件路径                output.push_back(str);//放入List队列尾                ID++;            }        } while (_findnext(lfDir, &fileDir) == 0);    }    _findclose(lfDir);    nfileAmount = ID;//获得文件数目    return output;};

数据输出方法

计划是可以适应多个类型的文件输出,但实际上我只用txt,其他类型没有写,重载的两个方法,分别用于输出浮点数和字符串

// 写实数到文件夹中指定文件名和文件类型的文件中,如不存在这样的文件可以创建//@parameter writedata:double 要写入的数字//@parameter writeFileName: char* 写入目标的文件名,如"file1"//@parameter writeFileType: char* 写入目标的文件类型,如"txt"void DirClass::write(double writedata, char* writeFileName, char* writeFileType){    ofstream outfile;    int len = strlen(Path) + strlen(writeFileName) + 1 + strlen(writeFileType);//设置文件完整路径字符串长度    char* fullfilePath = new char[len];    //文件完整路径=文件夹路径+文件名+"."+文件类型    strcpy(fullfilePath, Path);    strcat(fullfilePath, writeFileName);    strcat(fullfilePath, ".");//strcat字符串拼接函数    strcat(fullfilePath, writeFileType);//strcat函数使用之前必须先设置字符串长度    outfile.open(fullfilePath, ios::in | ios::out | ios::ate | ios::app);//打开文件,关于ofstream::open()函数,详见http://www.cplusplus.com/reference/fstream/ofstream/open/    outfile << writedata ;//输出数字到文件    outfile.close();//关闭文件}// 写实数到文件夹中指定文件名和文件类型的文件中,如不存在这样的文件可以创建//@parameter writedata:double 要写入的字符串//@parameter writeFileName: char* 写入目标的文件名,如"file1"//@parameter writeFileType: char* 写入目标的文件类型,如"txt"void DirClass::write(string writedata, char* writeFileName, char* writeFileType){    ofstream outfile;    int len = strlen(Path) + strlen(writeFileName) + 1 + strlen(writeFileType);//设置文件完整路径字符串长度    char* fullfilePath = new char[len];    //文件完整路径=文件夹路径+文件名+"."+文件类型    strcpy(fullfilePath, Path);    strcat(fullfilePath, writeFileName);    strcat(fullfilePath, ".");//strcat字符串拼接函数    strcat(fullfilePath, writeFileType);//strcat函数使用之前必须先设置字符串长度    outfile.open(fullfilePath, ios::in | ios::out | ios::ate | ios::app);//打开文件    outfile << writedata ;//输出数字到文件    outfile.close();//关闭文件}

如果觉得哪里写的烦琐,实属正常,因为我没系统学过C++,都是靠Baidu一点点摸索出来的。欢迎交流指正。

2017/2/3批注:
这个类是我在折腾OpenCV好一阵子后集结成的常用方法,实际上已经忘了他具体怎么实现,封装好直接用即可。

0 0
原创粉丝点击