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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:07