我正在使用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];
答案 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
直接传递给期望缓冲区指针的函数,因为它们不是同一个东西 - 它只是让你有机会避免一次额外复制字符串来自缓冲区。