Я использую 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];
GetPrivateProfileStringA
требуется буфер для написания классического C-стиля '\0'
строка в и std::string
это не такой буфер, хотя, как вы заметили, строка в стиле C может быть преобразована в std::string
,
Более конкретно, GetPrivateProfileStringA
ожидает char *
(LPSTR
в терминах Windows API) указывает на доступный для записи буфер и его длину. std::string
не обеспечивает это — в лучшем случае, это обеспечивает c_str()
метод доступа, который возвращает const char *
(LPCSTR
в терминах Windows API) — указатель на буфер только для чтения. const
Наличие буферных данных является довольно хорошим показателем того, что его изменение является плохой идеей и, скорее всего, приведет к неопределенному поведению.
C ++ ’98 гласит: «Программа не должна изменять никаких символов в этой последовательности». Однако реализации, соответствующие более новым стандартам, вполне могут с большей готовностью мириться с бизнесом обезьян: resize()
чтобы сделать буфер достаточно большим, используйте &foo[0]
чтобы получить char *
это не const
(или просто const_cast
снять защиту на data()
), позволять GetPrivateProfileStringA
записать в буфер, затем обрезать std::string
на '\0'
где бы он ни приземлился. Это все еще не позволяет вам пройти в std::string
напрямую к функции, ожидающей указатель буфера, потому что они не одно и то же — это просто дает вам возможность избежать копирования строки еще один раз из буфера.
Других решений пока нет …