Linux下C++读取文件去重的问题

发布网友

我来回答

1个回答

热心网友

#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <sstream>

class data_t{
public:
    data_t() : val(5){}

    std::string& operator[](int const i){
        return val[i];
    }
    std::string const& operator[](int const i) const{
        return val[i];
    }

private:
    std::vector<std::string> val;
};

template<int i>
struct cmp1{// 用于sort函数
    bool operator()(data_t const &a, data_t const &b) const{
        return a[i] < b[i];
    }
};

template<int i>
struct cmp2{// 用于unique函数
    bool operator()(data_t const &a, data_t const &b) const{
        return a[i] == b[i];
    }
};

int main(){
    std::ifstream istr("input.txt");
    if (!istr){
        std::cerr << "文件打开失败\n";
        return __LINE__;
    }

    typedef std::vector<data_t> vector_t;
    vector_t data;
    // 读取文件
    std::string line;
    int line_num = 0;
    while (getline(istr, line)){
        ++line_num;
        data_t tmp_data;
        std::istringstream tmp_str(line);
        int i = 0;
        for (; i != 5; ++i){
            if (!getline(tmp_str, tmp_data[i], '\t')){
                std::cerr << "在第" << line_num << "行发生错误\n";
            }
        }
        if (i == 5){// 该行读取成功
            data.push_back(tmp_data);
        }
    }

    // 按关键字1去重
    std::sort(data.begin(), data.end(), cmp1<0>());
    vector_t::iterator last = std::unique(data.begin(), data.end(), cmp2<0>());
    // 按关键字2去重
    std::sort(data.begin(), last, cmp1<1>());
    last = std::unique(data.begin(), last, cmp2<1>());
    
    data.erase(last, data.end());

    // 输出到另一个文件
    std::ofstream ostr("output.txt");
    if (!ostr){
        std::cerr << "文件打开失败\n";
        return __LINE__;
    }

    for (int i = 0; i != data.size(); ++i){
        for (int j = 0; j != 5; ++j){
            ostr << data[i][j] << "\t";
        }
        ostr << "\n";
    }

    return 0;
}

输入文件为input.txt,样例:

111    222    333    444    555
111    222    333    444    555
1111    222    333    444    555
1111    222    333    444    555
11111    222    333    444    555
11111    222    333    444    555
输出到output.txt,样例:
111    222    333    444    555

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com