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

为何我的C++程序仅向CSV文件输出一行(预期3行)?

CSV文件仅输出1行,遍历多个Customer对象未生效的解决方案

你的问题核心是每次调用outputCSVFile时都重新打开文件,默认的打开模式会清空原有内容,导致最后只有最后一个Customer的输出被保留。


方案一:外部统一管理文件流(推荐)

将文件流的打开逻辑移到main函数中,通过引用传递给每个Customer的输出方法,避免重复打开截断文件。

修改Customer类的outputCSVFile方法:

void Customer::outputCSVFile(std::ofstream& outputFile){
    // 移除内部的文件打开代码,直接使用传入的已打开流
    std::map<int, std::map<int, std::vector<int> > >::iterator itr;
    for(itr = monthly_records.begin(); itr != monthly_records.end(); ++itr){
        std::map<int, std::vector<int> >::iterator itr_2;
        for(itr_2 = itr->second.begin(); itr_2 != itr->second.end(); ++itr_2){
            if(itr_2->second[0] != 0){
                outputFile << this->getID() << ",";
                outputFile << itr_2->first << "/" << itr->first << ",";
                outputFile << itr_2->second[0] << ",";
                outputFile << itr_2->second[1] << ",";
                outputFile << itr_2->second[2] << "\n"; // 修正换行符写法
            }
        }
    }
}

修改main函数中的调用逻辑:

int main() {
    // ... 其他初始化代码 ...

    std::ofstream outputFile("output.csv");
    if (!outputFile.is_open()) {
        std::cerr << "Failed to open output file!" << std::endl;
        return 1;
    }

    std::map<std::string, Customer>::iterator itr_3;
    for(itr_3 = customers.begin(); itr_3 != customers.end(); ++itr_3){
        itr_3->second.outputCSVFile(outputFile);
    }

    outputFile.close();
    return 0;
}

方案二:使用追加模式打开文件(临时解决)

如果不想修改方法参数,可以在打开文件时指定std::ios::app追加模式,这样每次写入都会加到文件末尾,不会清空原有内容:

void Customer::outputCSVFile(){
    std::ofstream outputFile;
    // 使用app模式打开,避免截断文件
    outputFile.open("output.csv", std::ios::out | std::ios::app);
    
    // ... 原有遍历输出代码 ...
}

注意:这种方式的缺点是多次运行程序时,新输出会追加到旧文件后,而非覆盖,可能不符合长期需求。


额外提示:原代码中的换行符' '是非法写法,应替换为"\n"(仅换行)或std::endl(换行+刷新缓冲区)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:25:27