C++中如何使用printf同时实现控制台与文件双输出
问题根因
printf 是C标准库输出函数,默认仅绑定控制台对应的stdout标准输出流,本身不支持自动分流到多个输出目标,所以直接调整printf参数不可能实现控制台、文件同时输出的效果。
最小改动实现方案
你原有代码的对齐格式已经写好,完全不用推翻重写,只要加一层简单的输出封装,就能同时往控制台和文件写内容,改动量不到10行。
核心思路是写一个和printf用法完全一致的自定义函数,内部先调用printf往控制台打印内容,再调用C标准库的文件写函数往打开的文件里写入同一份内容,改完的可运行代码如下:
#include <iostream> #include <fstream> #include <cstdio> #include <cstdarg> #include <string> using namespace std; // 全局文件输出流,程序启动时自动打开,退出时自动关闭 ofstream outFile("salary_result.txt"); /** * 双输出函数:用法和printf完全一致,内容同时打印到控制台、写入目标文件 */ void dualPrintf(const char* format, ...) { va_list args; // 第一份输出到控制台 va_start(args, format); vprintf(format, args); va_end(args); // 第二份输出到文件 va_start(args, format); vfprintf(outFile, format, args); va_end(args); } int main() { string FirstName; // 变量声明 string LastName; double gross; double federalTax; double stateTax; // 每个变量存储对应类别的扣税总额 double ssTax; // 例如州税税率3.5%,该变量值即为总薪资的3.5% double mmTax; double pensionPlan; double healthIns; double netDeduct; double netPay; cout << "Please enter your first name: "; // 提示用户输入并存入变量 cin >> FirstName; cout << "\nPlease enter your last name: "; cin >> LastName; cout << "\nPlease enter your gross paycheck amount: "; cin >> gross; // 税费计算逻辑 federalTax = gross * .15; stateTax = gross * .035; ssTax = gross * .0575; mmTax = gross * .0275; pensionPlan = gross * .05; healthIns = 75; netDeduct = federalTax + stateTax + ssTax + mmTax + pensionPlan + healthIns; netPay = gross - netDeduct; // 输出结果,原printf全部替换为dualPrintf即可,原有格式完全保留 dualPrintf("\n%s %s\n", FirstName.c_str(), LastName.c_str()); dualPrintf("Gross Amount: %............ $%7.2f \n", gross); dualPrintf("Federal Tax: %............. $%7.2f \n", federalTax); dualPrintf("State Tax: %............... $%7.2f \n", stateTax); dualPrintf("Social Security Tax: %..... $%7.2f \n", ssTax); dualPrintf("Medicare/Medicaid Tax: %... $%7.2f \n", mmTax); dualPrintf("Pension Plan: %............ $%7.2f \n", pensionPlan); dualPrintf("Health Insurance: %........ $%7.2f \n", healthIns); dualPrintf("Net Pay: %................. $%7.2f \n", netPay); outFile.close(); return 0; }
补充说明
- 代码运行后会在程序同级目录生成
salary_result.txt,里面的内容和控制台输出完全一致 - 如果需要每次运行程序把结果追加到文件末尾、不覆盖之前的记录,把文件打开的代码改成
ofstream outFile("salary_result.txt", ios::app);即可 - 如果偏好纯C++流风格实现,也可以自定义一个流包装类,重载
<<运算符,内部同步向cout和文件流写入内容,核心逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Logan Thomas
相关产品推荐
相关产品推荐

