【问题标题】:c++: Converting DateTime To Be Used As A File Namec++: 将 DateTime 转换为文件名
【发布时间】:2017-05-30 21:14:44
【问题描述】:

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

如何将“屏幕”更改为当前日期时间?

我尝试过使用命名它的行,但我不断收到诸如“表达式必须具有整数或无范围枚举类型”之类的错误。我不确定那是什么意思。

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

    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;
    p_bmp->Save(L"screen_.jpg", &pngClsid, NULL);
    delete p_bmp;
}

更新:

这个版本没有给我任何错误,所以我会尝试使用它。当我的程序尝试使用它时,我将更新这篇文章以验证它是否正常工作! :)

修改后的代码:

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;
}

【问题讨论】:

  • 您是否尝试将该日期转换为字符串?
  • 由于 Save 方法接受宽字符串,您需要将 char* dt 转换为 wstring:stackoverflow.com/questions/2573834/…,然后将结果连接到文件扩展名。
  • std::time(0) “几乎总是一个整数值,保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数(不计算闰秒),对应于 POSIX 时间”因此对于一个唯一的(每秒)文件名,您可以考虑将 POSIX 时间“std::to_string(std::time(0))”附加到“image/”,然后可能是“/jpeg”?
  • 使用 strftime 将日期格式化为字符串
  • 如果您想在 Windows 中将冒号用作文件名,您需要及时处理冒号。我建议将时间格式化为 YYYYMMDD_HHMMSS,这样就很容易排序了。

标签: c++ string datetime


【解决方案1】:

实际上你就快到了。但是,还需要做一件事才能使其正常工作。在代码的最新编辑中,您传递了std::wstring 类型的Bitmap::Save(以及固有的Image::Save)的第一个参数,后者是std::basic_string&lt;wchar_t&gt; 的typedef。然而,该方法要求其第一个参数为WCHAR *。因此,您需要做的就是重写有问题的行,如下所示:

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

这应该可以解决问题。

问题的原因是std::basic_string&lt;CharT&gt;不能隐式转换为CharT*,而这种转换有一个特定的接口,即std::basic_string&lt;CharT&gt;::c_str()

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2017-02-07
    • 2013-07-30
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多