WritePrivateProfileString не добавляет свойство в конец

Я пишу некоторые свойства в ini файле, используя функцию WritePrivateProfileString, и все работает нормально, но когда я добавляю текст с несколькими строками, возникает проблема.

Вот код и вывод.

WritePrivateProfileString(_T("General"), _T("Name"), OLE2CT(text), FilePath);

Вывод:

[General]
Name=mytext

.

text = address\nstreet\nhouse
WritePrivateProfileString(_T("General"), _T("Address"), OLE2CT(text), FilePath);

Вывод:

[General]
Name=mytext
Address=address
street
house

Но когда после добавления нескольких позиций я добавляю другой элемент, вместо добавления этого конца добавляет новую строку сразу после адресной строки

text = city
WritePrivateProfileString(_T("General"), _T("City"), OLE2CT(text), FilePath);

Вывод:

[General]
Name=mytext
Address=address
City=city
street
house

но выход должен быть

[General]
Name=mytext
Address=address
street
house
City=city

Что такое проблема с моим кодом?

Ответ 1

Я настоятельно рекомендую вам прочитать ваши проблемы в блоге Майкла Каплана.

Если вам абсолютно необходимо использовать INI файлы, не используйте устаревшие функции Win32 API, которые вы используете прямо сейчас. Они ошибочны, и ошибки наверняка больше не будут исправлены, поскольку они устарели.

Вместо этого используйте SimpleIni - очень приличную кроссплатформенную реализацию устройства чтения/записи INI для C++.

Microsoft (в целом), похоже, не уверена, предпочитают ли они реестр или другие механизмы для хранения данных конфигурации. В какой-то момент это были INI файлы, затем это был реестр (для меня превосходный механизм), а затем он, похоже, сместился в сторону XML и других механизмов хранения на основе файлов. Это, безусловно, ваш вариант использования, который определит, что вам нужно, но учтите все предостерегающие слова об использовании этих устаревших функций и по крайней мере поищите альтернативный механизм работы с INI файлом.

Ответ 2

Хорошо, что это не правильный формат для INI файла для функций API, что вы ожидаете?

Формат для INI файла:

[section]
item1=item1text
item2=item2text
...

[anothersection]
item1=item1text
item2=item2text
...

Если вы хотите использовать вызовы ini API, вы должны придерживаться формата. Вы хотите, чтобы город, улица и дом были частью города? Затем поместите их все на "ту же строку" и используйте разделитель, который вы можете позже проанализировать для каждого поля. Вы могли бы использовать запятую, трубку или что-нибудь еще, что не будет частью текста.