使用map计算文件中每个单词出现的次数。 (C ++)

时间:2013-03-18 15:20:38

标签: c++ string file-io map

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <map>

using namespace std;

int main()
{
    ifstream fin;
    fin.open("myTextFile.txt");
    if ( fin.fail()){
        cout << "Could not open input file.";
        exit(1);
    }

    string next;
    map <string, int> words;
    while (fin >> next){
        words[next]++;
    }
    cout << "\n\n" << "Number of words: " << words[next] << endl;

    fin.close();
    fin.open("myTextFile.txt");
    while (fin >> next){
        cout << next << ": " << words[next] << endl;
    }

    fin.close();
    return 0;
}

我的主要问题是,当一个单词不止一次出现时,它也会被列出一次以上。即如果文本以“hello hello”开头,那么cout会产生: “你好:2”'\ n'“你好:2”

此外,我不想关闭,然后重新打开文件第二次是真的。它似乎仍然在最后一个while循环的文件末尾。

3 个答案:

答案 0 :(得分:2)

您需要通过地图进行迭代,而不是第二次打开文件。

查看提供的代码示例here

编辑:这里是一个通过地图迭代的代码示例

// map::begin/end
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;
  std::map<char,int>::iterator it;

  mymap['b'] = 100;
  mymap['a'] = 200;
  mymap['c'] = 300;

  // show content:
  for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  return 0;
}

这是输出:

a => 200
b => 100
c => 300

答案 1 :(得分:2)

您不需要重新打开文件:

for (auto i = words.begin(); i != words.end(); i++)
{
  cout << i->first << " : " << i->second << endl;
}

或更简单:

for (const auto &i : words)
{
  cout << i.first << " : " << i.second << endl;
}

答案 2 :(得分:0)

您需要在设置后迭代地图,然后您不需要再次打开文件,这是一个简单的例子:

int main()
{
  std::map<std::string, int> m1 ;

  m1["hello"] = 2 ;
  m1["world"] = 4 ;

  for( const auto &entry : m1 )
  {
    std::cout << entry.first << " : " << entry.second << std::endl ;
  }
}

预期输出为:

hello : 2
world : 4