0

まず、私の 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);
//                                            ^^^^^^^^^^^^^^^^^^

もしそうなら、どうすればいいですか?

みんなありがとう

4

5 に答える 5

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 でこれを行うための推奨される方法が何であるかはわかりませんが、誰が気にしますか ;))。

于 2014-02-17T01:18:35.217 に答える
0

C++11 の日付と時刻の機能によって提供されるタイムスタンプを使用できます。特に、名前空間のnow()関数は、std::chrono必要なものを返します。

#include <chrono>

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

std::ofstream out(oss.str(), std::ios_base::app);
于 2014-02-17T01:18:45.883 に答える
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.");
    }
}
于 2014-02-17T01:22:56.100 に答える
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;
}
于 2014-02-17T01:31:55.097 に答える
-1

次のようなことを試してください:

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);
于 2014-02-17T01:29:12.903 に答える