为何我的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
相关产品推荐
相关产品推荐

