在当前系统时间和日期之后,C ++无法命名txt文件

时间:2015-08-27 00:27:19

标签: c++

我有这个代码的问题我已经做了。它会编译,但是一旦我点击进入程序就会说:

Unhandled exception at 0x008E8641 in Log Test.exe: 0xC0000005: Access violation reading location 0x566D846A.

以下是代码:

#include <iostream>
#include <time.h>
#include <fstream>

using namespace std;

int main() {
    cin.get();
    time_t Time;
    Time = time(0);
    string Date = __DATE__;

    string LOG = Time + "_" + Date;

    ofstream TEST;
    TEST.open(LOG);
    TEST << "This Text Should Appear Inside Of File.";
    TEST.close();
    cout << "Log has been Made.";
    cin.get();
    return 0;
}

我相信问题是时间以及我如何尝试将其放入字符串但我不知道我做了什么并不起作用。

2 个答案:

答案 0 :(得分:2)

我认为Time是整数类型所以:

Time + "_"

会导致指针添加,因此添加到字符串中的内容是指向"_"开头之外的某个位置的错误指针。

您会看到像"_"这样的字符串文字实际上解析为地址(指针)。将Time这样的整数添加到简单中会使其指向内存中的其他位置。

首先,您需要将Time转换为字符串。

我碰巧有这个代码可能适合你:

std::string get_stamp()
{
    time_t t = std::time(0);
    char buf[sizeof("YYYY-MM-DD HH-MM-SS")];
    return {buf, std::strftime(buf, sizeof(buf), "%F %H-%M-%S", std::localtime(&t))};
}

注意:使用std::localtime不是安全的。

答案 1 :(得分:0)

如果您启用了编译器警告,那么它应该对此行尖叫:

nullptr

这里,string LOG = Time + "_" + Date; 正在转换为指针,并且您正在获得未定义的行为。对于不完全是C ++的解决方案,我推荐这种简单的方法:

Time

请注意,time_t t = time(0); struct tm ttm; localtime_r( &t, &ttm ); char timestamp[20]; // actually only need 17 chars plus terminator. sprintf_s( timestamp, sizeof(timestamp), "%04d-%02d-%02d_%02d%02d%02d", ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_day, ttm.tm_hour, ttm.tm_min, ttm.tm_sec ); string logfilename = string(timestamp) + ".log"; ofstream logfile( logfilename.c_str() ); 并非完全可移植。在Windows上,使用localtime_r,遗憾的是它也会颠倒参数的顺序。