尝试创建基于 UTC 时间的动态 csv 文件

Trying to create a dynamic csv file based on UTC time

提问人:Ankit Bhardwaj 提问时间:4/25/2023 最后编辑:Remy LebeauAnkit Bhardwaj 更新时间:4/25/2023 访问量:46

问:

我正在尝试使用 从 C++ 代码创建一个文件,但每次它都显示它无法创建我使用 .不知道为什么会这样。format(name + UTC Date Time)std::fstreamstd::cout

下面是打印输出的代码:

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();
}  

调用函数的位置。以下代码中的数据是包含以下函数的类的对象:writeCSV()writeCSV

string dateTime = data.getDateTime();
string fileName = "Big" + dateTime;

上面的代码正在调用一个返回当前 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!!!
C++ fstream ifstream ofstream ctime

评论

0赞 SeanTolstoyevski 4/25/2023
你像C一样编码C++,使用Chrono可以使你的工作更轻松。

答:

2赞 Remy Lebeau 4/25/2023 #1

在许多系统上,您不能在文件名中使用。例如,在 Windows 上::

命名文件、路径和命名空间

以下基本规则使应用程序能够创建和处理文件和目录的有效名称,而不考虑文件系统:

  • ...

  • 使用当前代码页中的任何字符作为名称,包括 Unicode 字符和扩展字符集 (128–255) 中的字符,但以下字符除外:

    • 以下保留字符:
      • <(小于)
      • >(大于)
      • (冒号)
      • "(双引号)
      • /(正斜杠)
      • \(反斜杠)
      • |(竖杆或管)
      • ?(问号)
      • *(星号)
  • ...

另请参阅此问题:文件名中允许的字符

因此,您需要将字符更改为更可接受的字符,例如 或 ,或者完全消除它们。:-_

此外,请考虑使用可控制文件名格式的函数,以便您可以仅包含实际需要的内容,而不是删除不需要的内容。

例如,使用 std::strftime():

#include <ctime>

string IOfile::makeCsvFileName()
{
    time_t now = time(nullptr);

    char buffer[32] = {};
    strftime(buffer, size(buffer), "Big%a%b%d%H_%M_%S%Y.csv", gmtime(&now));

    return buffer;
}

void IOfile::writeCsv(string write_file) {

    cout << write_file.size() << endl;
    cout << write_file << endl;

    string placeholder = ".csv";
    string finalFile = write_file + placeholder;
    
    cout << finalFile.size() <<endl;
    cout << finalFile << endl;

    ofstream file(finalFile);
    if (!file) {
        cout << "Error in creating file!!!";
    }
    else {
        cout << "File created successfully.";
        file.close();
    }
}

...

string fileName = makeCsvFileName();
writeCsv(fileName);

或者,使用 std:::p ut_time:

#include <sstream>
#include <iomanip>
#include <ctime>

string IOfile::makeCsvFileName()
{
    time_t now = time(nullptr);

    ostringstream oss;
    oss << put_time(gmtime(&now), "Big%a%b%d%H_%M_%S%Y.csv");

    return oss.str();
}

或者,使用 std::format():

#include <format>
#include <chrono>

string IOfile::makeCsvFileName()
{
    return std::format(
        "Big{0:%a}{0:%b}{0:%d}{0:%H}_{0:%M}_{0:%S}{0:%Y}.csv",
        std::chrono::utc_clock::now()
    );
}

顺便说一句:文件名有点难以阅读/理解,尤其是 and 部分。考虑使用更易读的文件名,例如:likeBigMonApr2422:45:572023.csv2422572023Big_YYYY-MM-DD_HH-MM-SS.csvBig_2023-04-24_22-45-57.csv