我正在尝试导出第二个文件中不在第一个文件中的所有行。这些行的顺序并不重要,我只是想找到那些不在第一个文件中的那些并将它们保存到difference.txt。
示例:
这是第一行 这是第二行 这是第三行
这是第一行 这是一些线路 这是第三行
现在比较一下......
这是一些行
这是我到目前为止所提出的。我知道我需要遍历第二个文件中的所有行,并将每行与第一个文件的每一行进行比较。对我来说没有任何意义,为什么它不起作用
void compfiles()
{
std::string diff;
std::cout << "-------- STARTING TO COMPARE FILES --------\n";
ifstream file2;
file2.open("C:\\\\firstfile.txt",ios::binary);
//---------- compare two files line by line ------------------
std::string str;
int j = 0;
while(!file2.eof())
{
getline(file2, str);
if(!CheckWord(str))
{
cout << "appending";
diff.append(str);
diff.append("\n");
}
j++;
}
ofstream myfile;
myfile.open ("C:\\\\difference.txt");
myfile << diff;
myfile.close();
}
bool CheckWord(std::string search)
{
ifstream file;
int matches = 0;
int c = 0;
file.open("C:\\\\secondfile.txt",ios::binary);
std::string stringf;
while(!file.eof())
{
getline(file, stringf);
if(strcmp(stringf.c_str(), search.c_str()))
{
matches += 1;
}
c++;
}
if(matches == 0)
{
return false;
}
else
{
return true;
}
}
任何帮助将不胜感激。感谢您阅读此文本块。
答案 0 :(得分:3)
这是一个使用std :: set:
的简单但更加有效和惯用的解决方案std::ifstream file1("firstfile.txt");
std::set<std::string> str_in_file1;
std::string s;
while (std::getline(file1, s)) {
str_in_file1.insert(s);
}
file1.close();
std::ifstream file2("secondfile.txt");
std::ofstream file_diff("diff.txt");
while (std::getline(file2, s)) {
if (str_in_file1.find(s) == str_in_file1.end()) {
file_diff << s << std::endl;
}
}
file2.close();
file_diff.close();
此外,您可能希望使用名为 diff 的工具。它完全符合您的要求。
答案 1 :(得分:3)
此代码不符合您的预期:
if (strcmp(stringf.c_str(), search.c_str()))
{
matches += 1;
}
当字符串相等时, strcmp()
返回0,但代码不会递增
在这种情况下matches
。
答案 2 :(得分:0)
如果你想手动完成,那么听起来你不需要c ++程序,但你可以使用grep从命令行执行此操作。
grep -vxFf firstfile.txt secondfile.txt > difference.txt