提问人:Ankit Bhardwaj 提问时间:4/25/2023 最后编辑:Remy LebeauAnkit Bhardwaj 更新时间:4/25/2023 访问量:46
尝试创建基于 UTC 时间的动态 csv 文件
Trying to create a dynamic csv file based on UTC time
问:
我正在尝试使用 从 C++ 代码创建一个文件,但每次它都显示它无法创建我使用 .不知道为什么会这样。format(name + UTC Date Time)
std::fstream
std::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!!!
答:
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.csv
2422
572023
Big_YYYY-MM-DD_HH-MM-SS.csv
Big_2023-04-24_22-45-57.csv
评论