C++如何统计文件中各类字符总数并按要求输出到stats.txt
代码补充思路
- 输入文件打开失败后新增退出逻辑,避免后续无效操作
- 新增逐字符读取逻辑,用
ifstream::get()读取所有字符(包含空白、换行符),避免>>运算符跳过空白字符的问题 - 每个字符读取后调用
<cctype>库函数判断所属分类,对应计数器累加 - 按要求格式化输出统计结果到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
相关产品推荐
相关产品推荐

