2014-10-30 33 views
0

所以我无法从document1中抓取一个单词并将它与document2中的单词列表进行比较。因此,当我运行该程序时,document1的第一个单词与document2的单词列表进行比较,但document1中的下一个单词不与document2中的列表进行比较。我不确定问题是什么......它与.eof()函数有关吗?如何将文件中的单词与另一个文件中的单词列表进行比较以用于C++?

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(); 

OUTPUT:


outputDictionary

+1

我看不到在这个代码中的列表或比较。 – Barry 2014-10-30 17:43:06

回答

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(); 
+0

我正在使用命名空间标准。我如何使用set函数? – user3390252 2014-10-30 18:02:34

+0

@ user3390252只是'#include '其余所有内容都在编辑好的代码中... – SHR 2014-10-30 18:09:14

+0

由于actualDoc是一个单词字典,可能相当大,所以最好将该文件读入集合,然后遍历observeDoc另一种方式。 – taylorc93 2014-10-30 18:16:22

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(); 
+0

我已经试过了你说的话,结果基本上和以前一样... – user3390252 2014-10-30 17:51:46

+0

你必须在打开它之前关闭文件,否则它会失败(或者只是使用'seekg'方法)。 – 0x499602D2 2014-10-30 17:55:21

相关问题