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

关于C++中文件单词的二维数组存储逻辑及词频二维展示的技术问询

嘿,我来帮你搞定这个问题!你的代码现在有几个明显的小问题,而且我们得先明确行列的定义逻辑,一步步来:

一、先修复当前代码的致命问题

你的rows和column变量根本没初始化,它们会是随机的垃圾值,直接用来给数组赋值肯定会出问题——要么越界崩溃,要么乱存到数组的奇怪位置。这是你现在代码最紧急的问题。

二、明确行列的划分逻辑

结合你最后要统计单词出现次数的需求,我们可以给二维数组定个清晰的规则:

  • 每一行代表一个唯一的单词
  • 列固定为2列:第0列存单词本身,第1列存该单词的出现次数(转成字符串类型,适配你用的string二维数组)

这样逻辑就顺了,rows的数量就是文件中不同单词的总数,column不用再纠结动态变化,固定2列足够。

三、实现步骤(从读文件到统计再到存二维数组)

1. 先高效统计单词次数

直接用二维数组统计会很麻烦,我们可以先用std::map(或者std::unordered_map)来快速统计每个单词的出现次数,它会自动帮我们去重,之后再把结果转存到二维数组里。

2. 处理单词大小写(可选)

注意你文件里有steve和Studying这种大小写不同的单词,如果想把Steve和steve当成同一个词统计,可以先把所有单词转成小写(或大写)。

3. 把统计结果转存到二维数组

遍历我们的map,把每个单词和对应的次数(转成string)依次放到二维数组的每一行里。

四、完整代码示例

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <algorithm> // 用于transform转小写

using namespace std;

// 辅助函数:把字符串转成小写
string toLower(string s) {
    transform(s.begin(), s.end(), s.begin(), ::tolower);
    return s;
}

int main() {
    string word;
    map<string, int> wordCount; // 用来统计单词出现次数
    string arr[10][2]; // 假设最多10个不同单词,列数固定为2(单词、次数)
    int currentRow = 0; // 当前要存的行索引

    // 读取文件并统计单词
    fstream myFile("name.txt");
    if (!myFile.is_open()) { // 先检查文件是否打开成功
        cout << "无法打开文件!" << endl;
        return 1;
    }

    while (myFile >> word) {
        // 可选:转成小写,统一统计大小写不同的相同单词
        string lowerWord = toLower(word);
        wordCount[lowerWord]++;
        // 如果不需要统一大小写,直接用word即可:wordCount[word]++;
    }
    myFile.close();

    // 把统计结果转存到二维数组
    for (auto& pair : wordCount) {
        if (currentRow >= 10) { // 检查数组是否越界
            cout << "单词数量超过数组最大行数限制!" << endl;
            break;
        }
        arr[currentRow][0] = pair.first; // 第0列存单词
        arr[currentRow][1] = to_string(pair.second); // 第1列存次数(转成string)
        currentRow++;
    }

    // 打印二维数组的内容
    cout << "单词统计结果(二维数组形式):" << endl;
    for (int i = 0; i < currentRow; i++) {
        cout << "行" << i << ": [" << arr[i][0] << ", " << arr[i][1] << "]" << endl;
    }

    return 0;
}

五、代码说明

  • 用map统计次数,既能自动去重,又比直接操作二维数组简单太多。
  • 加入了文件打开失败的判断,这是写文件操作时的良好习惯。
  • 可选的大小写转换函数,如果你不需要区分大小写就注释掉这部分即可。
  • 加了数组越界检查,避免因为单词数量超过你定义的10行而崩溃。

针对你的name.txt内容(It's steve Studying CPP and steve loves cooking),如果开启小写转换,输出会是:

单词统计结果(二维数组形式):
行0: [and, 1]
行1: [cooking, 1]
行2: [cpp, 1]
行3: [it's, 1]
行4: [loves, 1]
行5: [studying, 1]
行6: [steve, 2]

如果不开启小写转换,Studying会单独成为一行,次数为1,steve次数还是2。

内容的提问来源于stack exchange,提问作者Mitul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:53:12