如何将文件中的单词与C ++中另一个文件中的单词列表进行比较?

时间:2014-10-30 17:35:16

标签: c++ nested-loops ifstream

所以我在抓取document1中的单词并将其与document2中的单词列表进行比较时遇到了麻烦。因此,当我运行程序时,document1的第一个单词与document2的单词列表进行比较,但document1中的下一个单词与document2中的列表相比较。我不确定问题是什么...它与.eof()函数有关吗?

string typedString, actualString, document1 = "A.txt", document2 = "Dictionary.txt";
ifstream observeDoc, actualDoc;

observeDoc.open(document1);
actualDoc.open(document2);

while (observeDoc.is_open())
{
    while (true)
    {
        observeDoc >> typedString;
        if (observeDoc.eof()) break;
        cout << typedString << endl;

        while (true)
        {
            actualDoc >> actualString;
            if (actualDoc.eof())
            {
                actualDoc.open(document1);
                break;
            }
            cout << '\t' << actualString << endl;
        }
    }
    if (observeDoc.eof()) break;
}

observeDoc.close();
actualDoc.close();

输出:


outputDictionary

2 个答案:

答案 0 :(得分:3)

您需要返回文件的开头。

您可以使用:observeDoc.seekg(0,ios::beg);

更好的解决方案是将第一个文件的所有单词从类型std::set<std::string>读取到对象,并且对于第二个文件中的每个单词,检查集合中是否存在。通过这种方式,您只需在每个文件上移动一次,而无需快退。

std::set<std::string> words;
observeDoc.open(document1); 
while (observeDoc >> typedString){
   words.insert(typedString);
}
observeDoc.close();

actualDoc.open(document2);
while(actualDoc >> actualString){
   if (words.find( actualString )!= words.end()){
     //word exists in observer doc!
   }
} 
actualDoc.close();

答案 1 :(得分:1)

您的问题是,在循环结束时,actualDoc未正确重置。此外,您的循环语法可能更清晰。试试这个:

string typedString, actualString, document1 = "A.txt", document2 = "Dictionary.txt";
ifstream observeDoc, actualDoc;

observeDoc.open(document1);
actualDoc.open(document2);

// Will stop when it reads in EOF
while (observeDoc >> typedString)
{    
    while (actualDoc >> actualString)
    {
        // Do your comparisons here
    }
    actualDoc.open(document2); //reset actualDoc to start from the beginning of the file
    // or, as @SHR recommended, use observeDoc.seekg(0,ios::beg);
}

observeDoc.close();
actualDoc.close();