在两个文件中查找不同的字符串 - C ++

时间:2013-06-24 21:25:15

标签: c++

我正在尝试导出第二个文件中不在第一个文件中的所有行。这些行的顺序并不重要,我只是想找到那些不在第一个文件中的那些并将它们保存到difference.txt。

示例:

firstfile.txt

  

这是第一行   这是第二行   这是第三行

secondfile.txt

  

这是第一行   这是一些线路   这是第三行

现在比较一下......

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;
    }
}

任何帮助将不胜感激。感谢您阅读此文本块。

3 个答案:

答案 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