#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循环的文件末尾。
答案 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