C ++如何在将文本文件读入字符串时忽略文本文件中的符号/数字?

时间:2017-10-24 03:54:00

标签: c++ string dictionary count words

我正在开展一个项目,我需要创建一个计算文本文件中唯一单词的单词计数器。在课堂上,我们刚刚学习了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;
}

2 个答案:

答案 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阅读时,它会立即删除任何标点符号。