所以我在抓取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();
输出:
答案 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();