文件逐行读入C++版

看见这篇 http://www.oschina.net/code/snippet_147269_27318?p=2#comments ,忍不住写C++的

#include <iostream> 
#include <ios> 
#include <ostream> 
#include <iomanip> 
#include <streambuf> 
#include <string> 
#include <iosfwd> 
#include <fstream> 
#include <istream> 
#include <functional>
#include <vector>
class file
{
public: /*构造与析构*/
    file(const wchar_t* filename/* = L"d://1.txt"*/, const int _linelength = 4096)
        : fs()
        , linelength(_linelength)
    {
        fs.open(filename);
    }
    ~file()
    {
        fs.close();
    }
public:
    // 对文件流用callback处理
    void go(std::function<void(std::wfstream&)> callback)
    {
        if (callback == nullptr)
        {
            std::wstring str;
            //while (fs>>str) // 按词读入
            while (getline(fs, str, linelength)) // 按行读入
            {
                std::wcout<<str<<std::endl;
            }
            ::system("pause");
        }
        else
        {
            callback(fs);
        }
    }
    // 对文件流每一行读取并用eachline_callback处理每一行
    void eachline(std::function<void(std::wstring)> eachline_callback)
    {
        if (eachline_callback == nullptr)
        {
            // do sth for null callback
        }
        else
        {
            std::wstring str;
            //while (fs>>str) // 按词读入
            while (getline(fs, str, linelength)) // 按行读入
            {
                eachline_callback(str);
            }
        }
    }
public:
    // 从文件流里面读取一行
    // 如果文件里面的一行太长则可能被截断剩下的作为另一行(TODO)
    static bool getline(std::wfstream& fs, std::wstring& str, const int cnt = 4096)
    {
        std::vector<wchar_t> vec(cnt, L'\0');
        bool b = (nullptr!=fs.getline(&vec[0], cnt));
        str = &vec[0];
        return b;
    }
private:
    // 包装的文件流
    std::wfstream fs;
    // 从文件中读取一行的最大长度
    int linelength;
};

你可能感兴趣的:(c/c++,文件流,逐行读取)