C++如何读取指定文件的所有唯一单词存入数组并展示
现有代码问题说明
- 你申请的
char数组只有100字节,文件内容超过100字节就会触发数组越界,导致未定义行为 while(my_file.eof()==0)的判断逻辑错误,eof()标记是在读完最后一个有效字符后才会置为true,会导致多读一个无效字符写入数组
唯一单词识别实现思路
- 第一步:将文件内容分割为独立单词,默认以空格、换行、制表符等空白符作为单词分隔符,可按需扩展标点等其他分隔符
- 第二步:使用C++标准库自带去重能力的容器存储单词,
std::set<std::string>或std::unordered_set<std::string>都可以,插入元素时会自动过滤重复值,最终容器内留存的就是所有唯一单词 - 第三步:遍历容器输出结果即可
完整实现代码
不需要先把全部内容读入char数组,C++的文件流用>>读取std::string时默认就会按空白符分割单词,简化实现逻辑:
#include <iostream> #include <fstream> #include <string> #include <unordered_set> using namespace std; int main() { // unordered_set自动去重,查找插入效率更高 unordered_set<string> unique_words; string word; fstream my_file("name.txt"); if (!my_file) { cout << "No such file" << endl; return 1; } // 直接按单词读取,自动跳过空白分隔符 while (my_file >> word) { // 可选:如果不需要区分大小写,可在此处将word统一转成小写/大写再插入 unique_words.insert(word); } my_file.close(); // 输出所有唯一单词 cout << "唯一单词列表:" << endl; for (const auto& w : unique_words) { cout << w << endl; } return 0; }
如果你必须基于已读入char数组的内容做单词分割,只需要遍历数组,遇到分隔符时就把之前积累的字符作为一个单词插入去重容器,清空临时字符串后继续遍历即可。
可选优化点
- 不需要区分大小写识别时,插入容器前统一把单词转成全大写或全小写
- 需要过滤单词首尾标点时(例如把
hello,处理为hello),插入容器前清理掉单词首尾的非字母/数字字符
内容的提问来源于stack exchange,提问作者Mitul
相关产品推荐
相关产品推荐

