c ++:转换DateTime以用作文件名

时间:2017-05-30 21:14:44

标签: c++ string datetime

我正在为我的程序制作屏幕捕获方法。对于每个屏幕截图,我试图将基于DateTime命名的图像降低到第二个。现在,一切都会被命名为screen.jpg。

如何更改"屏幕"到当前的DateTime?

我尝试过使用命名它的行,但我只是不断收到错误,例如"表达式必须包含整数或无范围的枚举类型。"我不确定这意味着什么。

void BitmapToJpg(HBITMAP hbmpImage, int width, int height)
{
    time_t now = time(0);
    char* dt = ctime(&now);

    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    std::wstring wide = converter.from_bytes(dt);


    Bitmap *p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL);
    //Bitmap *p_bmp = new Bitmap(width, height, PixelFormat32bppARGB);

    CLSID pngClsid;
    int result = GetEncoderClsid(L"image/jpeg", &pngClsid);
    if (result != -1)
        std::cout << "Encoder succeeded" << std::endl;
    else
        std::cout << "Encoder failed" << std::endl;
    std::wstring fileName = std::wstring(L"screen_") + wide + (L".jpg");
    p_bmp->Save(fileName.c_str(), &pngClsid, NULL);
    delete p_bmp;
}

更新

这个版本没有给我任何错误,所以我打算尝试使用它。我的程序试图使用它时,我会更新此帖子以验证它是否正常工作! :)

修订代码:

(br)

1 个答案:

答案 0 :(得分:4)

你其实几乎就在那里。但是,为了实现这一目标,还需要做一件事。从代码的最新编辑开始,您传递Bitmap::Save的第一个参数(以及Image::Save},类型std::wstring,后者是std::basic_string<wchar_t>的typedef 。但是,该方法要求其第一个参数为WCHAR *。因此,您需要做的就是重新编写有问题的行,如下所示:

std::wstring fileName = std::wstring(L"screen_") + wide + L(".jpg");
p_bmp->Save(fileName.c_str(), &pngClsid, NULL);

这应该可以解决问题。

问题的原因是std::basic_string<CharT>无法隐式转换为CharT*,并且有一个特定的转换接口,即std::basic_string<CharT>::c_str()