C++使用std::fstream创建带UTC时间的CSV文件失败问题
问题:创建含UTC时间的CSV文件失败
尝试用C++的std::fstream创建格式为「名称+UTC时间」的CSV文件,每次都提示文件创建失败,但std::cout输出的文件名显示正常,不清楚原因。
相关代码
1. 输出信息并创建文件的writeCsv函数
void IOfile::writeCsv(string write_file) { write_file.erase(std::remove_if(write_file.begin(), write_file.end(), ::isspace), write_file.end()); cout << write_file.size() << endl; cout << write_file << endl; string placeholder = ".csv"; string finalFile = write_file + placeholder; cout << finalFile.size()<<endl; cout << finalFile<< endl; fstream file; file.open(finalFile, fstream::out); if (!file) { cout << "Error in creating file!!!"; } else { cout << "File created successfully."; } file.close(); }
2. writeCsv函数的调用代码
string dateTime = data.getDateTime(); string fileName = "Big" + dateTime;
3. 获取GMT时间的getDateTime函数
string IOfile::getDateTime() { time_t now = time(0); char* currentTime = ctime(&now); tm* gmtm = gmtime(&now);//to get GMT time currentTime = asctime(gmtm); return currentTime; };
当前输出结果
23 BigMonApr2422:45:572023 27 BigMonApr2422:45:572023.csv Error in creating file!!!
问题原因
生成的文件名包含Windows系统禁止的特殊字符:(来自时间格式里的时分秒分隔符)。虽然控制台输出时该字符可见,但系统无法识别带冒号的文件名,因此创建文件失败。
解决方案
方法1:替换文件名中的非法字符
在生成最终文件名前,将时间字符串中的冒号替换为下划线等合法字符:
void IOfile::writeCsv(string write_file) { // 移除空格 write_file.erase(std::remove_if(write_file.begin(), write_file.end(), ::isspace), write_file.end()); // 将冒号替换为下划线 std::replace(write_file.begin(), write_file.end(), ':', '_'); cout << write_file.size() << endl; cout << write_file << endl; string placeholder = ".csv"; string finalFile = write_file + placeholder; cout << finalFile.size()<<endl; cout << finalFile<< endl; fstream file; file.open(finalFile, fstream::out); if (!file) { cout << "Error in creating file!!!"; } else { cout << "File created successfully."; } file.close(); }
方法2:用strftime直接生成合法时间格式
通过strftime自定义时间格式,避免生成非法字符,同时更可控:
string IOfile::getDateTime() { time_t now = time(0); tm* gmtm = gmtime(&now); char buffer[80]; // 格式化为不含非法字符的字符串,例:MonApr2422_45_572023 strftime(buffer, sizeof(buffer), "%a%b%d%H_%M_%S%Y", gmtm); return string(buffer); };
总结
文件创建失败的核心原因是文件名包含系统不允许的特殊字符,通过替换非法字符或直接生成合法格式的时间字符串即可解决问题。
内容的提问来源于stack exchange,提问作者Ankit Bhardwaj
相关产品推荐
相关产品推荐

