c++讀寫.txt檔(以每行為單位)

初衷:

建立一個可以讀寫.txt檔的零件。
需求:
以每一行'\n'為單位,把vector<std::string>丟進去就可以得到文件文容。
可以讀取任意大小(至少是很大的)文件。
原始碼放在Github,以BSD LICENSE
kxTxtFile.h
#ifndef TXTFILE_H
#define TXTFILE_H
#include <vector>
#include <string>
#include <fstream>

class kxTxtFile
{
    std::fstream ftxt_Std;
    std::vector dtxt_Txt;

public:
    bool Open(const char*);
    bool Save(const char*);

    void Close(){ ftxt_Std.close(); };

    void iTxtData(std::vector& data){ dtxt_Txt = data; mem2file(); };
    void oTxtData(std::vector& data){ file2mem(); data = dtxt_Txt; };
    std::vector oTxtData(){ file2mem(); return dtxt_Txt; };

private:
    void file2mem();
    void mem2file();
};
#endif
kxTxtFile.cpp
#include "kxTxtFile.h"

bool kxTxtFile::Open(const char* path)
{
    ftxt_Std.open (path, std::ifstream::in);
    return ftxt_Std.good();
}

bool kxTxtFile::Save(const char* path)
{
    ftxt_Std.open (path, std::ifstream::out | std::ifstream::trunc);
    return ftxt_Std.good();
}

void kxTxtFile::file2mem()
{
    dtxt_Txt.clear();
    std::string str;

    while (getline(ftxt_Std , str))
        dtxt_Txt.push_back(str);
}

void kxTxtFile::mem2file()
{
    if (!dtxt_Txt.empty())
    {
        for (std::vector::iterator it = dtxt_Txt.begin(); it != dtxt_Txt.end(); ++it)
        {   
            *it += '\n';
            ftxt_Std.write(it->c_str(), it->length());
        }
    }
}
主程式的使用情況
#include <iostream>
#include <fstream>
#include <vector>
#include "kxTxtFile.h"

using namespace std;

int main()
{
    kxTxtFile ifile;

    if (!ifile.Open("readFilePath"))
        std::cout << "read error" << std::endl;

    std::vector vstr;
    ifile.oTxtData(vstr);
    ifile.Close();

    for (std::vector::iterator it = vstr.begin(); it != vstr.end(); ++it)
        std::cout << *it << std::endl;  

    kxTxtFile ofile;

    if (!ofile.Save("saveFilePath"))
        std::cout << "save error" << std::endl;
    
    ofile.iTxtData(vstr);

    ofile.Close();
    return 0;
}

沒有留言:

張貼留言

(什麼是留言欄訊息?)