计算某些单词在C ++中显示在文本文件中的次数

时间:2013-04-05 08:25:49

标签: c++ string file-io

我正在尝试使用两个不同的文本文件制作程序。其中一个包含我想要分析的实际文本,另一个包含单词列表。该程序应该检查列表中的单词何时显示在文本中并计算。这是我到目前为止的(非工作)代码:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main () {

    string word1;
    string word2;
    int listHits = 0;

    ifstream data1 ("text.txt");
    if ( ! data1 ) {
    cout << "could not open file: " << "text.txt" << endl;
        exit ( EXIT_FAILURE );
  }

    ifstream data2 ("list.txt");
    if ( ! data2 ) {
    cout << "could not open file: " << "list.txt" << endl;
        exit ( EXIT_FAILURE );
  }

    while ( data1 >> word1 ) {
        while ( data2 >> word2 ) {
            if ( word1 == word2 ) {
                listHits++;
            }
        }
    }

    cout << "Your text had " << listHits << " words from the list " << endl;

    system("pause");

    return 0;
}

如果text.txt包含

  

这是一个文字。它将被加载到程序中。

和list.txt包含

  

预期的结果是3.然而,无论文本文件中的内容是什么,程序总是给我答案0.我已经检查过程序实际上设法通过计算它执行循环的次数来读取文件,它的确有效。

提前致谢

2 个答案:

答案 0 :(得分:1)

在我看来,你总是只将第一个文件的第一个字母与整个第二个文件进行比较,你可以这样做:

  while ( data1 >> word1 ) {
        while ( data2 >> word2 ) { // <---- after this ends the first time, it will never enter again
            if ( word1 == word2 ) {
                listHits++;
            }
        }

你需要在第二个循环完成后“重置”data2,以便从文件的开头再次开始读取:

 while ( data1 >> word1 ) {
        while ( data2 >> word2 ) {
            if ( word1 == word2 ) {
                listHits++;
            }    
        }
        data2.seekg (0, data2.beg);
   }

答案 1 :(得分:1)

您的程序只会浏览一次“目标词列表”(即data2)文件。文件流是“单向的”:一旦你耗尽它,你需要倒回它,或者它将保持最后。内环

while ( data2 >> word2 )
    ...

将仅在第一次执行时执行,即对data1的第一个单词执行。对于第二个和所有后续单词,data2已经位于文件末尾,因此代码甚至不会进入循环。

您应该在内存中读取目标单词,并在内循环中使用该列表。更好的是,将单词放在set<string>中,并使用该集进行计数。