如何将文本文件中的客户信息读取并写入发票输出文件?
读取客户信息生成发票文件的解决方案
嘿,我来帮你搞定这个读取客户信息并生成发票的问题!首先咱们先理清楚你的需求:你有一行包含多个客户的文本数据,每个客户的信息格式是「全名(含空格)+ 电话号码 + 三个数字数量 + 颜色」,需要把这些数据读取出来,处理成规整的发票格式写入输出文件。
先看你给出的初始代码,有个小语法问题:const int BLACK=35, RED=30, BROWN=25 后面缺了分号,得补上,不然编译会报错。
接下来是完整的实现代码,我会一步步拆解关键点:
#include <iostream> #include <string> #include <fstream> #include <iomanip> using namespace std; const int BLACK = 35, RED = 30, BROWN = 25; // 补充分号,定义各颜色对应的单价 int main() { // 打开输入文件和输出文件 ifstream inputFile("customers.txt"); ofstream outputFile("invoice.txt"); // 检查文件是否成功打开,避免因文件不存在/权限问题崩溃 if (!inputFile.is_open() || !outputFile.is_open()) { cerr << "无法打开文件,请检查文件路径或权限!" << endl; return 1; } // 设置输出格式:金额保留两位小数,用setw控制列宽对齐 outputFile << fixed << setprecision(2); // 写入发票表头 outputFile << left << setw(25) << "客户姓名" << setw(15) << "电话号码" << setw(10) << "总数量" << setw(10) << "单价" << setw(10) << "总金额" << endl; outputFile << string(70, '-') << endl; // 表头分割线 string firstName, lastName, phone, color; int qty1, qty2, qty3; int unitPrice; int totalQty; double totalAmount; // 循环读取每个客户的信息,直到文件末尾 while (inputFile >> firstName >> lastName >> phone >> qty1 >> qty2 >> qty3 >> color) { string fullName = firstName + " " + lastName; totalQty = qty1 + qty2 + qty3; // 根据颜色匹配对应单价 if (color == "Black") { unitPrice = BLACK; } else if (color == "Red") { unitPrice = RED; } else if (color == "Brown") { unitPrice = BROWN; } else { unitPrice = 0; // 处理未知颜色的默认情况 } totalAmount = totalQty * unitPrice; // 将格式化后的发票内容写入输出文件 outputFile << left << setw(25) << fullName << setw(15) << phone << setw(10) << totalQty << setw(10) << unitPrice << setw(10) << totalAmount << endl; } // 关闭文件,养成良好的资源释放习惯 inputFile.close(); outputFile.close(); cout << "发票已成功生成!" << endl; return 0; }
关键细节说明:
- 文件合法性检查:必须判断文件是否成功打开,避免因文件不存在、路径错误或权限问题导致程序异常
- 姓名读取处理:因为客户姓名包含空格,所以拆分成
firstName和lastName分别读取,再组合成完整姓名;其他字段按顺序直接读取即可 - 单价匹配逻辑:用
if-else判断颜色对应的单价,如果你用的是C++17及以上版本,也可以换成switch(对字符串的支持) - 格式化输出:用
setw()控制列宽、left实现左对齐,fixed和setprecision(2)确保金额显示两位小数,让发票看起来更规整专业 - 循环读取逻辑:
while循环会自动持续读取直到文件末尾,能处理任意数量的客户信息
测试你的输入数据:
把你给出的文本内容保存为customers.txt:
George Washington 703-780-2000 100 50 3 Black Dan Goldberg 800-600-6014 2 2 1 Red
运行程序后,invoice.txt会生成如下规整的发票内容:
客户姓名 电话号码 总数量 单价 总金额 ---------------------------------------------------------------------- George Washington 703-780-2000 153 35 5355.00 Dan Goldberg 800-600-6014 5 30 150.00
如果你的三个数字是不同产品的数量,需要分别计算金额,只需要修改totalAmount的计算逻辑即可,比如:
totalAmount = qty1*unitPrice + qty2*unitPrice + qty3*unitPrice;
(如果不同产品单价不同,就需要单独定义每个产品的单价啦)
内容的提问来源于stack exchange,提问作者EthanT24
相关产品推荐
相关产品推荐

