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

如何将文本文件中的客户信息读取并写入发票输出文件?

读取客户信息生成发票文件的解决方案

嘿,我来帮你搞定这个读取客户信息并生成发票的问题!首先咱们先理清楚你的需求:你有一行包含多个客户的文本数据,每个客户的信息格式是「全名(含空格)+ 电话号码 + 三个数字数量 + 颜色」,需要把这些数据读取出来,处理成规整的发票格式写入输出文件。

先看你给出的初始代码,有个小语法问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:16