C ++ - 使用没有缓冲区的GetPrivateProfileString

时间:2016-02-26 00:07:55

标签: c++ string lpstr

我正在使用GetPrivateProfileStringA从.ini文件中读取一些内容。我有一些其他的类,我保存的东西和一个字符串数组。我必须像这样使用它来获取ControlAlt数组中的正确字符串:

char buffer[24];
GetPrivateProfileStringA("CONTROLS",
    "ShiftUpAlt",
    "LeftThumb",
    buffer,
    (DWORD)24,
    "./Gears.ini");
scriptControl->ControlAlt[ScriptControls::ControlType::ShiftUp] = buffer;

我试过直接把它放进去,就像这样:

GetPrivateProfileStringA("CONTROLS",
    "ShiftUpAlt",
    "LeftThumb",
    (LPSTR)scriptControl->ControlAlt[ScriptControls::ControlType::ShiftUp],
    (DWORD)24,
    "./Gears.ini");

但是ControlAlt中的值是LPSTR,后来在将它与正确的字符串进行比较时会产生复杂性。有没有办法不为此使用缓冲区?

ControlAlt定义为std::string ControlAlt[SIZEOF_ControlType];

1 个答案:

答案 0 :(得分:1)

GetPrivateProfileStringA需要一个缓冲区来编写经典的C风格'\0' - 终止的字符串,而std::string不是这样的缓冲区,尽管如你所观察到的那样,C风格字符串可以转换为std::string

更具体地说,GetPrivateProfileStringA期望char *(Windows API术语中为LPSTR)指向可写缓冲区和缓冲区的长度。 std::string不提供此功能 - 它最多只提供c_str()访问器,它返回const char *(Windows API术语中的LPCSTR) - 指向只读缓冲区的指针。缓冲区数据的const是一个非常好的迹象,表明修改它是一个坏主意,并且很可能会导致未定义的行为。

C ++' 98说:"程序不得改变此序列中的任何字符。"但是,符合更新标准的实现可能更愿意忍受猴子业务:resize()以使缓冲区足够大,然后使用&foo[0]来获得char *不是&#39} ; t const(或仅const_cast取消data()上的保护,让GetPrivateProfileStringA写入缓冲区,然后截断std::string '\0'它到达的任何地方。这仍然不允许你将std::string直接传递给期望缓冲区指针的函数,因为它们不是同一个东西 - 它只是让你有机会避免一次额外复制字符串来自缓冲区。