C ++如何检查2个相似文件中没有哪些单词

时间:2018-07-30 04:06:29

标签: c++ c++98

我正试图找到一种方法来检查两个不同的文件,并从第二个开始获取不在第一个中的所有行..却相反。

我试图解决这个问题,但是什么也没有...

这是代码:

int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
char username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);

stringstream buffer;
buffer << "C:\\Users\\" << username << "\\Desktop\\";
stringstream buffer2;
buffer2 << "C:\\Users\\" << username << "\\Desktop\\Legit.txt";
stringstream buffer3;
buffer3 << "C:\\Users\\" << username << "\\Desktop\\Unlegit.txt";
stringstream buffer4;
buffer4 << "C:\\Users\\" << username << "\\Desktop\\result.txt";

string results = buffer4.str();

int offset;
int num;
num = 1;
string search;
string linea;
string legit;
string unlegit;
string line;

cout << "Is the Legit.txt file at '" << buffer.str() << "'? [Y/N]: ";
cin >> legit;
if (legit == "Y" || legit == "y"){
}else if(legit == "N" || legit == "n"){
    return 0;
}else{
    cout << "\n.";
    return 0;
}
string legitfile = buffer2.str();

cout << "\nIs the Unlegit.txt file at '" << buffer.str() << "'? [Y/N]: ";
cin >> unlegit;
if (unlegit == "Y" || unlegit == "y"){
}else if(unlegit == "N" || unlegit == "n"){
    return 0;
}else{
    cout << "\n";
    return 0;
}
string unlegitfile = buffer3.str();

ifstream file(legitfile.c_str());
if(file.is_open()){
while(getline(file, line)){
    ifstream MyFile(unlegitfile.c_str());

    if(MyFile.is_open()){
        while(!MyFile.eof()){
            getline(MyFile,linea);
            if((offset = linea.find(line, 0)) != string::npos) {
                cout << "\n[" << num << "]" << " Word Found: " << line << "\n";
                num++;
                fstream result(results.c_str());
                result << line << "\n";
                result.close();
            }
        }
        MyFile.close();
    }
}
file.close();
return 0;
}else{
cout << "\nThe file '" << legitfile << "' does not exist.";
cout << "\nThe file '" << unlegitfile << "' does not exist.";
}
}

正如我所说,这段代码检查两个(第一个和第二个)文件中的哪个词相等,一旦找到,就将它们写入第三个文件,有一种方法可以做相反的操作(检查两个文件并获取不相等的单词)?非常感谢!

我是新来的,无论是在论坛中还是在C ++中,如果出现任何错误,均表示抱歉。 (也很抱歉我的英语不好)。

2 个答案:

答案 0 :(得分:1)

解决此类问题的经典方法是使用哈希表集合来表示第一个文件中的所有单词。然后,在从第二个文件迭代项目时,请查阅由第一个文件构成的集合。在C ++中,std::unordered_set会很好。

#include <unordered_set>
using namespace std;

unordered_set<string> firstFileSet;
unordered_set<string> missingFromSecondFileSet;
string line;

while(!firstfile.eof())
{
    getline(firstfile,line);
    firstFileSet.insert(line);
}

然后针对第二个文件中的每个单词,使用第二组集合来跟踪丢失的单词。

while(!secondfile.eof())
{
    getline(secondfile,line);

    if (firstFileSet.find(line) != firstFileSet.end())
    {
        missingFromSecondFileSet.insert(line);
    }
    else
    {
        firstFileSet.erase(line);
    }
}

上述运行之后,firstFileSet包含第一个文件中所有在第二个文件中不存在的行。 missingFromSecondFileSet包含第二个文件中所有不在第一个文件中的行:

for (auto &s : firstFileSet)
{
    cout << s << " was in the first file, but not the second" << endl;
}

for (auto &s : missingFromSecondFileSet)
{
    cout << s << " was in the second file, but not the first" << endl;
}

答案 1 :(得分:0)

在Linux上有一个名为diff的程序,它可以完成您在C ++中要做的事情。

它是用C语言编写的,因此您只需复制其源代码= P

mysql

取自ftp://mirrors.kernel.org/gnu/diffutils/diffutils-3.0.tar.gz> src / analyze.c