将 time() 打印到文件会导致二进制字符
Printing time() to a file results in binary characters
我想将时间打印到输出文件中。我正在使用以下代码来做到这一点:
time_t currentTime;
struct tm *localTime;
time( ¤tTime ); // Get the current time
localTime = localtime( ¤tTime ); // Convert the current time to the local time
int Day = localTime->tm_mday;
int Month = localTime->tm_mon + 1;
int Year = localTime->tm_year + 1900;
int Hour = localTime->tm_hour;
int Min = localTime->tm_min;
int Sec = localTime->tm_sec;
output << "SimpleLD run at " << Day << "/" << Month << "/" << Year << " " << Hour << ":" << Min << ":" << Sec << std::endl;
其中output为输出文件。我是 运行 多个处理器上的代码,但只有 0 级处理器写入文件。对于某些运行(4、8、16 核),这可以正常工作。但对于其他人(32、64 核),这会导致输出文件打印:
00[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]\
并且文件认为它是二进制文件,而不是 .txt 文件。一些较高的核心数可以正确打印。我究竟做错了什么?无论代码 运行 在多少个内核上,我如何获得正确打印的时间?
您的问题可能源于 localtime()
函数 不是 线程安全的。它 returns 一个指向静态缓冲区的指针,如果其他来源调用 localtime()
.
,该缓冲区可能会损坏
有一个名为 localtime_r()
的 localtime()
的线程安全实现,它在某些系统上可用。如果这不是一个选项,您需要确保在任何给定点只有一个线程正在调用或使用 localtime()
的结果。
我让每个内核都打开了输出文件,即使只有 1 个内核正在写入它。当我只有写入输出文件的 MPI 等级打开它时,问题似乎消失了。
我想将时间打印到输出文件中。我正在使用以下代码来做到这一点:
time_t currentTime;
struct tm *localTime;
time( ¤tTime ); // Get the current time
localTime = localtime( ¤tTime ); // Convert the current time to the local time
int Day = localTime->tm_mday;
int Month = localTime->tm_mon + 1;
int Year = localTime->tm_year + 1900;
int Hour = localTime->tm_hour;
int Min = localTime->tm_min;
int Sec = localTime->tm_sec;
output << "SimpleLD run at " << Day << "/" << Month << "/" << Year << " " << Hour << ":" << Min << ":" << Sec << std::endl;
其中output为输出文件。我是 运行 多个处理器上的代码,但只有 0 级处理器写入文件。对于某些运行(4、8、16 核),这可以正常工作。但对于其他人(32、64 核),这会导致输出文件打印:
00[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]\
并且文件认为它是二进制文件,而不是 .txt 文件。一些较高的核心数可以正确打印。我究竟做错了什么?无论代码 运行 在多少个内核上,我如何获得正确打印的时间?
您的问题可能源于 localtime()
函数 不是 线程安全的。它 returns 一个指向静态缓冲区的指针,如果其他来源调用 localtime()
.
有一个名为 localtime_r()
的 localtime()
的线程安全实现,它在某些系统上可用。如果这不是一个选项,您需要确保在任何给定点只有一个线程正在调用或使用 localtime()
的结果。
我让每个内核都打开了输出文件,即使只有 1 个内核正在写入它。当我只有写入输出文件的 MPI 等级打开它时,问题似乎消失了。