我正在开展一个项目,我需要创建一个计算文本文件中唯一单词的单词计数器。在课堂上,我们刚刚学习了STL,我们应该使用地图制作程序。我在文件中读到的内容并准确计算,除了它不会忽略符号或数字,我需要它做。例如,就像现在一样,它计算单词" file"和"档案。"作为两个单独的词。我该如何解决这个问题?我遇到的另一个问题是这些词应该按字母顺序打印。这就是我到目前为止所做的。
#include <iostream>
#include <map>
#include <fstream>
#include <string>
using namespace std;
template <class words, class counter>
void PrintMap(map<words, counter> map)
{
typedef std::map<words, counter>::iterator iterator;
for (iterator p = map.begin(); p != map.end(); p++)
cout << p->first << ": " << p->second << endl;
}
int main()
{
static const char* fileName = "D:\\MyFile.txt";
map<string, int> wordCount;
{
ifstream fileStream(fileName);
if (fileStream.is_open())
while (fileStream.good())
{
string word;
fileStream >> word;
if (wordCount.find(word) == wordCount.end())
wordCount[word] = 1;
else
wordCount[word]++;
}
else
{
cerr << "Couldn't open the file." << endl;
return EXIT_FAILURE;
}
PrintMap(wordCount);
}
system("PAUSE");
return 0;
}
答案 0 :(得分:0)
您可以编写一个单独的函数来删除每个字符串中不需要的符号,然后再在wordCount字典中检查它。例如,在您阅读一个新单词后,您可以运行一个小修剪功能,逐字逐句地查看是否有任何字符== a&#39;。&#39;或者&#39; - &#39;等
答案 1 :(得分:0)
原则上,Jake Killpack的回答是正确的。你可以读取字符串,然后修剪它或你调整在C ++中读取字符串的行为。根据{{3}}:
[
operator >>
] [...]然后从is读取字符并将它们附加到str,就好像是 str.append(1,c),直到满足下列条件之一:
- [...]
- std :: isspace(c,is.getloc())对于is中的下一个字符c为真(此空白字符保留在输入流中)。
显然,标点符号不是空格,因此它们也会被读取并添加到单词中。要进行更改,您必须调整std::isspace
s.t的行为。它将标点符号视为空白,这可以做到,即使它很尴尬:
struct punctws_ctype : std::ctype<char> {
static const mask* table() {
static std::vector<mask> v(classic_table(), classic_table() + table_size);
v[','] |= space; // classify comma as whitespace
v['.'] |= space; // accordingly...
v['-'] |= space;
return &v[0];
}
my_ctype(std::size_t refs = 0) : std::ctype<char>{ table(), false, refs } { }
};
之后,在您阅读该流之前:
// apply the modified behaviour to the stream:
fileStream.imbue(std::locale{ fileStream.getloc(), new my_ctype });
现在,在使用fileStream >> word
阅读时,它会立即删除任何标点符号。