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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:51