关于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
相关产品推荐
相关产品推荐

