Как я могу назвать текстовый файл, который я создаю после текущей даты / времени

Прежде всего, мои знания X ++ минимальны, мне просто нужно отредактировать код, который мне дали.
У меня есть программа на C ++, которая создает текстовый файл и сохраняет в нем данные. Прямо сейчас программа использует:

outfile.open("C:/Users/Admin/Documents/MATLAB/datafile.txt", std::ios::app);

Но мне нужно изменить этот код, поэтому каждый раз, когда я запускаю этот код, он создает новое имя файла. Мое предложение состоит в том, чтобы как-то включить время / дату в качестве имени файла, но я не уверен, как это сделать. Я пытался исследовать вокруг, и это похоже на использование time_t это путь, но я не уверен, как использовать его для моего случая.

Можно ли сохранить время / дату как переменную, а затем использовать:

outfile.open("C:/Users/td954/Documents/MATLAB/<DEFINED VARIABLE>", std::ios::app);
//                                            ^^^^^^^^^^^^^^^^^^

если так, как бы я пошел по этому поводу?

Спасибо, парни

0

Решение

Вот код:

time_t currentTime = time(0);
tm* currentDate = localtime(&currentTime);
char filename[256] = {0};

strcpy(filename, "C:/Users/Admin/Documents/MATLAB/datafile");
strcat(filename, fmt("-%d-%d-%d@%d.%d.%d.txt",
currentDate->tm_hour, currentDate->tm_min, currentDate->tm_sec,
currentDate->tm_mday, currentDate->tm_mon+1,
currentDate->tm_year+1900).c_str());

outfile.open(filename, std::ios::app);

tm * и time_t находятся в заголовке ctime. fmt — это просто функция, подобная sprintf, которая форматирует строку. Реализация (не моя, найдена в stackoverflow IIRC):

#include <cstdarg>
std::string fmt(const std::string& fmt, ...) {
int size = 200;
std::string str;
va_list ap;
while (1) {
str.resize(size);
va_start(ap, fmt);
int n = vsnprintf((char*)str.c_str(), size, fmt.c_str(), ap);
va_end(ap);
if (n > -1 && n < size) {
str.resize(n);
return str;
}
if (n > -1)
size = n + 1;
else
size *= 2;
}
return str;
}
0

Другие решения

Конечно, вы можете сделать что-то вроде этого:

// Calculate the path
time_t current_time = time(nullptr);
std::ostringstream path_out(prefix);
path_out << "-" < < current_time << ".txt";
std::string path = path_out.str();

// Open a file with the specified path.
std::ofstream out(path.c_str(), std::ios::app);

// do stuff with "out"

При этом, если вы пытаетесь использовать время для имени файла для создания временных файлов, то решение, которое вы ищете, вероятно, зависит от платформы. В системах на основе UNIX, mkstemp является предпочтительным способом создания временных файлов (я не уверен, что предпочтительный способ сделать это в Windows, но кого это волнует;)).

0

Вы можете использовать временную метку, предоставляемую средствами даты и времени в C ++ 11. В частности, now() функция std::chrono namespace вернет то, что вы хотите:

#include <chrono>

std::ostringstream oss;
oss << "myfile" << std::chrono::system_clock::now() << ".txt";
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

std::ofstream out(oss.str(), std::ios_base::app);
0

#include <ctime>
#include <stdexcept>
#include <sstream>

std::string getTimestampedFilename(const std::string &basePathname) {
std::ostringstream filename;
filename << basePathname << '.' << static_cast<unsigned long>(::time(0));
return filename.str();
}

Теперь вы можете использовать это в другом месте …

template<class T>
void writeToFile(const std::string &basePathname, T data) {
std::string filename = getTimestampedFilename(basePathname);
std::ofstream outfile(filename.c_str());

if (outfile) {
outfile << data;
}
else {
throw std::runtime_error("Cannot open '" + filename + "' for writing.");
}
}
0

Попробуйте что-то вроде этого:

std::time_t t = std::time(NULL);
std::tm *ptm = std::localtime(&t);
std::stringstream ss;
ss << ptm->tm_year+1900 << std::setw(2) << ptm->tm_mon+1 << ptm->tm_mday << ptm->tm_hour+1 << ptm->tm_min+1 << ptm->tm_sec+1;
outfile.open(("C:/Users/Admin/Documents/MATLAB/datafile_"+ss.str()+".txt").c_str(), std::ios::app);
-1
По вопросам рекламы [email protected]