You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:57