发布网友
共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