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

C++如何统计文件中各类字符总数并按要求输出到stats.txt

代码补充思路

  1. 输入文件打开失败后新增退出逻辑,避免后续无效操作
  2. 新增逐字符读取逻辑,用ifstream::get()读取所有字符(包含空白、换行符),避免>>运算符跳过空白字符的问题
  3. 每个字符读取后调用<cctype>库函数判断所属分类,对应计数器累加
  4. 按要求格式化输出统计结果到stats.txt,通过setw控制列宽实现对齐,百分比计算后保留1位小数

完整可运行代码

#include <iostream>
#include <cctype>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib> // 新增头文件,保证exit()函数可用

using namespace std;

int main() {
    int character;
    string filename;
    int alpha = 0, num = 0, con = 0, UC = 0, LC = 0, pun = 0, total = 0;

    cout << "Enter file name and extension to process.\n";
    cin >> filename;

    ofstream fileout;
    ifstream filein;

    // 打开输入文件
    filein.open(filename);
    if (filein.fail()) {
        cerr << "Failed to open the file: " << filename << endl;
        system("pause");
        exit(1); // 打开失败直接退出
    }

    // 打开输出文件
    fileout.open("stats.txt");
    if (fileout.fail()) {
        cout << "Error, unable to open output file\n";
        system("pause");
        exit(1);
    }

    // 逐字符读取统计
    while ((character = filein.get()) != EOF) {
        total++;
        unsigned char c = static_cast<unsigned char>(character); // 避免负数字符判断出错
        if (isalpha(c)) {
            alpha++;
            if (isupper(c)) UC++;
            else if (islower(c)) LC++;
        }
        if (isdigit(c)) num++;
        if (iscntrl(c)) con++;
        if (ispunct(c)) pun++;
    }

    // 输出格式化表格
    const int name_col = 35; // 分类名列宽,可自行调整
    const int count_col = 10; // 计数列宽,可自行调整
    const int percent_col = 8; // 百分比列宽,可自行调整
    fileout << left << setw(name_col) << "字符分类" << right << setw(count_col) << "出现次数" << setw(percent_col) << "占比" << endl;
    fileout << string(name_col + count_col + percent_col, '-') << endl; // 分隔线

    // 逐行输出分类统计
    fileout << left << setw(name_col) << "字母字符(Alphabetic characters)" 
            << right << setw(count_col) << alpha 
            << setw(percent_col) << fixed << setprecision(1) << (total == 0 ? 0 : alpha * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "数字字符(Numeric characters)" 
            << right << setw(count_col) << num 
            << setw(percent_col) << (total == 0 ? 0 : num * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "控制字符(Control characters)" 
            << right << setw(count_col) << con 
            << setw(percent_col) << (total == 0 ? 0 : con * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "大写字符(Upper case characters)" 
            << right << setw(count_col) << UC 
            << setw(percent_col) << (total == 0 ? 0 : UC * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "小写字符(Lower case characters)" 
            << right << setw(count_col) << LC 
            << setw(percent_col) << (total == 0 ? 0 : LC * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "标点字符(Punctuation characters)" 
            << right << setw(count_col) << pun 
            << setw(percent_col) << (total == 0 ? 0 : pun * 100.0 / total) << "%" << endl;
    
    fileout << left << setw(name_col) << "文件总字符数" 
            << right << setw(count_col) << total 
            << setw(percent_col) << "" << endl;

    filein.close();
    fileout.close();
    system("pause");
    return 0;
}

注意说明

  • 新增了总字符为0的判断,避免除0运行错误
  • 字符判断前转成unsigned char,规避部分编译器对负ASCII值判断异常的问题
  • 三个列宽常量可根据实际显示需求自行调整数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:07