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