C++ STL读取文件:保留连字符且不将其计为单词的问题
解决连字符被误统计为未知单词的问题
我明白你的问题了——单独的连字符被当成了一个未知单词计入统计,导致UnknownWords多了1个。咱们来修复这个问题:
问题根源
当你的文本里有单独的-时,ifile >> word会把它读成一个独立的字符串,经过转换小写和清理后,它还是-。因为字典里肯定没有这个“单词”,所以它被加入了UnknownWords,导致统计数多了1。
解决方案
在处理完单词后,先判断这个“单词”是否是无效的(比如空字符串,或者全是连字符/撇号),如果是就跳过,不进行统计。
修改后的代码如下:
void WordStats::ReadTxtFile(){ std::ifstream ifile(Filename); if(!ifile) { std::cerr << "Error Opening file " << Filename << std::endl; exit(1); } for (std::string word; ifile >> word; ) { // 转换为小写 transform (word.begin(), word.end(), word.begin(), ::tolower); // 移除非字母字符,保留撇号和连字符 word.erase(std::remove_if(word.begin(), word.end(), [](char c) { return (c < 'a' || c > 'z') && c != '\'' && c != '-'; }), word.end()); // 新增判断:跳过无效的"单词"(空或全是连字符/撇号) if (word.empty() || std::all_of(word.begin(), word.end(), [](char c) { return c == '-' || c == '\''; })) { continue; } if (Dictionary.count(word)) { KnownWords[word].push_back(ifile.tellg()); } else { UnknownWords[word].push_back(ifile.tellg()); } } std::cout << KnownWords.size() << " known words read." << std::endl; std::cout << UnknownWords.size() << " unknown words read." << std::endl; }
说明
std::all_of会检查字符串里的每个字符是否都是连字符或撇号,如果是,说明这不是一个真正的单词,直接跳过统计。- 同时也处理了清理后变成空字符串的情况(比如原单词全是非字母字符)。
这样修改后,单独的-就不会被计入UnknownWords了,你的统计结果就会和期望一致:110 Known words read 78 Unknown words read。
内容的提问来源于stack exchange,提问作者muzzi
相关产品推荐
相关产品推荐

