C++读取文件逐行提取文件名后缀并统计重复扩展名实现问题
解决方案
逐行读取逻辑说明
你当前使用的infile >> str默认以空白符(换行、空格、制表符等)作为分隔读取内容,如果你存储的file.txt每行仅存在1个文件名,该写法已经可以自动跳过换行读取下一个文件名,无需额外实现「跳转下一行」的逻辑。
如果后续需要兼容带空格的文件名,可以将读取逻辑替换为getline(infile, str)显式读取整行内容。
扩展名重复统计实现
你不需要手动写条件判断逐一对比扩展名,直接使用C++标准库提供的std::map/std::unordered_map键值对容器即可自动完成去重和计数,容器会以扩展名作为key,出现次数作为value自动维护统计结果。
完整可运行代码
#include <iostream> #include <fstream> #include <string> #include <map> // 引入map容器头文件 using namespace std; int main() { ifstream infile; infile.open("file.txt"); // 增加文件打开失败的异常判断 if (!infile.is_open()) { cout << "文件打开失败,请确认file.txt存在" << endl; return 1; } string str, sub; map<string, int> ext_count; // 定义扩展名-计数的映射容器 while(infile >> str) { size_t pos = str.find("."); // 兼容没有扩展名的文件,避免非法截取 if (pos == string::npos) { continue; } sub = str.substr(pos + 1); ext_count[sub]++; // 自动统计:不存在则初始化计数为1,已存在则计数+1 } infile.close(); // 输出所有扩展名的统计结果 cout << "各扩展名出现次数统计:" << endl; for (auto& item : ext_count) { cout << item.first << ": " << item.second << endl; } return 0; }
补充说明
如果你只需要统计某一个特定扩展名的数量,比如仅统计cpp的出现次数,不需要遍历输出所有结果,可以在截取sub之后加判断if (sub == "cpp") count++;即可。
内容的提问来源于stack exchange,提问作者user14735245
相关产品推荐
相关产品推荐

