строка — Использование GetPrivateProfileString без буфера

Я использую 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

Решение

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 напрямую к функции, ожидающей указатель буфера, потому что они не одно и то же — это просто дает вам возможность избежать копирования строки еще один раз из буфера.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]