Что такое код getprivateprofilestring

С++ читать параметры файла конфигурации с помощью GetPrivateProfileString

У меня есть консольное приложение win32 в C++, Visual Studio 2012. Я не могу получить параметр конфигурации из ini файла. Я пробовал разные возможности с пути к файлу, например, поместив файл.ini в исходную папку, напишите полный путь к которой, поместив его в папку сгенерированным файлом.exe. Вывод на консоли после выполнения файла.exe равен 0 или (null) для строки в каждом случае. Что я делаю неправильно? Как я могу прочитать параметры?

Oups, под Windows удары ini файла не так просто. В обеих попытках (v1 и v2) вы ищете файл в текущем каталоге, а затем в каталоге Windows но не в каталоге, в котором находится исполняемый файл.

Легкий способ — поместить все ini файлы в каталог Windows. Если вы обнаружите, что у очистителя есть файл ini вместе с exe one, у вас есть еще одна работа:

  • найти полный путь исполняемого файла
  • замените exe end на ini
  • используйте этот полный путь, чтобы получить доступ к вашему частному ini файлу

Чтобы получить имя исполняемого файла, просто используйте GetModuleFileName с NULL HMODULE :

или если вы предпочитаете напрямую получать имя ini файла:

и не забывать удалять имя файла, когда он сделан, поскольку он выделяется новым.

Изменить за комментарий:

Для справки, каталог Windows может зависеть от версии Windows. Но он всегда может быть восстановлен функцией API GetWindowsDirectory . Выдержка со страницы справки:

  • lpBuffer [out] Указатель на буфер, который получает путь. Этот путь не заканчивается обратной косой чертой, если каталог Windows не является корневым каталогом. Например, если каталог Windows называется Windows на диске C, путь к каталогу Windows, полученный этой функцией, — C:\Windows. Если система была установлена в корневом каталоге диска C, путь, который был получен, — C :.
  • uSize [in] Максимальный размер буфера, заданного параметром lpBuffer, в TCHAR. Это значение должно быть установлено в MAX_PATH.

Если функция завершается успешно, возвращаемое значение представляет собой длину строки, скопированной в буфер, в TCHAR, не включая завершающий нулевой символ.

Если длина больше размера буфера, возвращаемое значение представляет собой размер буфера, необходимый для хранения пути.

Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. *

GetPrivateProfileString иногда возвращает 0 для различных комбинаций секций / клавиш

Имея новую проблему с ini-файлом и getPrivateProfileString-разочаровывающий бит, они хорошо работали вместе около 3 лет, и только за последние пару дней что-то заставило их волноваться, и время от времени он ничего не возвращает для одного из полей, которые я ищу. Я проверил людей, которые поддерживают сервер, и ничего не изменилось, что они знают.

Я посмотрел на этот ответ и попытался удалить спецификацию из файла и добавить дополнительный разрыв строки в качестве первой строки — ни один из них не работает.

Странная вещь заключается в том, что это не происходит с одной и той же комбинацией секций/клавиш каждый раз, и все секции не одинаковы — я заметил, что это происходит с ключами из 4 разных секций до сих пор, и это обычно терпит неудачу только на 1 из ключей, которые я загружаю, хотя это было до 3 для одного запуска (из примерно 20). Я довольно хорошо в тупике.

Вот код, который вызывает GetPrivateProfileString:

Опять же, большинство звонков на эту работу, но некоторые нет, и это делает мою голову. Спасибо!

Что такое код getprivateprofilestring

Версия для печати

Конференция: Конференция iXBT.com (http://forum.ixbt.com/) Форум: Архив «Программирование» (http://forum.ixbt.com/? > URL: http://forum.ixbt.com/topic.cgi? > Время GMT +03. Даты в формате dd.mm.yyyy.
Inquisitive , 18.07.2001 13:07
Кто может рассказать поподробнее об этой функции? Открывает ли она ini-файл при считывании данных из него, и если да, то закрывает ли потом? Или нужно самому позаботиться о закрытии? И поподробнее вообще о работе с ini-файлами.
1. QZ , 18.07.2001 13:09
Inquisitive
это API, а не Visual C++
и всё написано в MSDN :>

цитата: QZ:
Inquisitive
это API, а не Visual C++
и всё написано в MSDN :>

2. Inquisitive , 18.07.2001 14:34
3. AlexNek , 18.07.2001 14:43
Ну нет у человека MSDN, а то бы и не спрашивал.
Вот смотри кусочек. Открыть/закрыть файл всё автоматом.

GetPrivateProfileString
The GetPrivateProfileString function retrieves a string from the specified section in an initialization file.

Note This function is provided only for compatibility with 16-bit Windows-based applications. Win32-based applications should store initialization information in the registry.

The GetPrivateProfileString function searches the specified initialization file for a key that matches the name specified by the lpKeyName parameter under the section heading specified by the lpAppName parameter. If it finds the key, the function copies the corresponding string to the buffer. If the key does not exist, the function copies the default character string specified by the lpDefault parameter. A section in the initialization file must have the following form:

If lpAppName is NULL, GetPrivateProfileString copies all section names in the specified file to the supplied buffer. If lpKeyName is NULL, the function copies all key names in the specified section to the supplied buffer. An application can use this method to enumerate all of the sections and keys in a file. In either case, each string is followed by a null character and the final string is followed by a second null character. If the supplied destination buffer is too small to hold all the strings, the last string is truncated and followed by two null characters.

If the string associated with lpKeyName is enclosed in single or double quotation marks, the marks are discarded when the GetPrivateProfileString function retrieves the string.

The GetPrivateProfileString function is not case-sensitive; the strings can be a combination of uppercase and lowercase letters.

To retrieve a string from the Win.ini file, use the GetProfileString function.

4. QZ , 18.07.2001 14:45
Ну нет у человека MSDN, а то бы и не спрашивал.
http://msdn.microsoft.com/library
5. tdv , 18.07.2001 14:49
Inquisitive

Microsoft говорит что эта функция устарела и пользоваться ей не надо.

цитата:
This function is provided for compatibility with 16-bit Windows-based applications. Win32-based applications should store initialization information in the registry.

А что касается файлов, то эта функция сомодостаточна и все, что нужно она делает сама.

Вот же. Пока это писал уже пара ответов появилась

6. Inquisitive , 18.07.2001 14:50
Всем большое спасибо

Добавление от 18-07-2001 14:54:

[q]tdv:
Спасибо за совет. Дело в том, что эта часть программы писана не мной, и я уже подумываю о ее радикальном изменении.

7. vagner , 18.07.2001 16:34
И появится еще одна программа, «пачкающая» реестр. Да ini-фйал куда лучше. Лежит себе тихонько и никому не мешает. А если поднапрячься и пользоваться не стандартным, который ложится в %WIN_DIR%, а брать из текущего директория, то можно иметь несколько конфигураций запуска одной и той же программы.
8. Inquisitive , 18.07.2001 16:55
vagner:
И появится еще одна программа, «пачкающая» реестр. Да ini-фйал куда лучше. Лежит себе тихонько и никому не мешает. А если поднапрячься и пользоваться не стандартным, который ложится в %WIN_DIR%, а брать из текущего директория, то можно иметь несколько конфигураций запуска одной и той же программы.
У меня ini-файл как раз создается в текущей директории и берется потом оттуда же. И конфигурации запуска две: Debug и Release. Но основная проблема в том, что после обновления файла (не закрывая прогу) нужно, чтобы обновлялись и данные на экране в соответствии с файлом. У меня происходит такая вещь: сохранили файл, обновляем вид, он перерисовывается, но со старыми данными, которых фактически уже не должно быть на диске (?!). Но! Если открыть этот файл каким-нибудь редактором, а потом просто закрыть (а прога в это время не закрыта, работает), активизировать прогу — вот те на — перерисовка с новыми данными! Было подозрение, что где-то все таки этот ini-файл не закрывается, но уже все пересмотрел, все облазил — везде все нормально в этом плане.
9. Odi$$ey , 18.07.2001 17:01
все правильно, винда кеширует ini-файлы по-черному, как бороться не знаю, не было необходимости.
10. Inquisitive , 18.07.2001 17:05
Odi$$ey:
все правильно, винда кеширует ini-файлы по-черному, как бороться не знаю, не было необходимости.

Неужели так все плохо? Какой-нить выход есть? Может тогда заново переписать банально с методами CFile?

11. AlexNek , 18.07.2001 17:12
Проблема может быть и в самой твоей программе попробуй просто перейти в другую программу и назад. Но я вообще не читаю регистр напрямую. Делаю примерно так:
12. Odi$$ey , 18.07.2001 17:12
а пишешь в файл через WritePrivateProfileString ?

Добавление от 18-07-2001 17:14:

этоя к тому, что если пользоваться парой GetPrivateProfileString — WritePrivateProfileString никаких заморочек быть не должно (во всяком случае, у меня не было)

13. Inquisitive , 18.07.2001 17:24
AlexNek
Спасибо, попробую
Odi$$ey:
То-то и оно, что нет. Насоветовали в свое время такие же ламеры, как я. У меня уже была мысль записывать данные в файл функцией WritePrivateProfileString (это самое естественное решение, я думаю), только не хотелось код переделывать. А теперь просто уверен, что надо. Спасибо, всё попробую

14. AlexNek , 18.07.2001 18:20
Inquisitive
а ещё забыл. Что бы не мучаться с глобальной переменной, можно добавить ещё код: (Только не всегда это можно использовать, например в DLL)
15. Inquisitive , 19.07.2001 11:23
Odi$$ey:
а пишешь в файл через WritePrivateProfileString ?

Встречный вопрос: функция WritePrivateProfileString пишет строку в секцию поверх предшествующей (которая была в файле до того, как стали писать туда данные, т.е. обновлять) или сдвигает ее? По моим наблюдениям — сдвигает. Может, лучше все данные предварительно удалять из файла и писать заново? А если сам файл удалить, то создаст ли эта функция новый с заданым именем? Что лучше — удалять данные или сам файл? Вот такие чайниковые вопросы. В help-е что-то не откапывается, или я читать не умею.

16. Prog2 Michael , 19.07.2001 12:08
Inquisitive
Согласен с Odi$$ey если использовать GetPrivateProfileString и WritePrivateProfileString, то проблем не будет, а за размещение Ключа, Секции отвечает Windows, Она их запишет, Она же их и прочитает. Только ИМХО в Win3.1 было ограничение на размер INI-файла до 64К, а как с тех пор не знаю.
17. Inquisitive , 19.07.2001 12:33
Prog2 Michael:
Odi$$ey

Еще вопрос: как изменить имя секции в ini-файле? Например: было [red], стало [green]. Оно должно меняться при обновлении данных.

18. tdv , 19.07.2001 16:24
Используя .ini фаил вы делаете свою программу неудобной для многопользовательской работы так как все настройки видны всем пользователям на этом компе, а в реестре если использовать HKEY_CURRENT_USER все получается как надо.

vagner
А чистить реестр должна программа uninstall если она конечно есть. Так что реестр пачкают только плохие программы и причина тому лень автора программы

Еще вопрос: как изменить имя секции в ini-файле? Например: было [red], стало [green]. Оно должно меняться при обновлении данных.

Можно наверное, но как-то это через одно место получается, против логики построения ini-файла — секция это имя группы параметров, у параметра есть имя и значение, меняться должны только значения у параметров. Все остальное — извращения, которые и приводят к глюкам, подобным рассматриваемому.

Добавление от 19-07-2001 18:06:

цитата: Inquisitive:
Odi$$ey:
а пишешь в файл через WritePrivateProfileString ?

Встречный вопрос: функция WritePrivateProfileString пишет строку в секцию поверх предшествующей (которая была в файле до того, как стали писать туда данные, т.е. обновлять) или сдвигает ее?.

А какая разница? WriteP. заносит в ini файл новое значение параметра в указаннной секции, GetP. читает значение указанного параметра из указанной секции. А в каком порядке там строки — должно быть совершенно по барабану.

Не удается получить код ошибки из GetPrivateProfileString

0 DzungAh [2013-07-19 11:18:00]

И описание из MSDN: In the event the initialization file specified by lpFileName is not found, or contains invalid values, this function will set errorno with a value of ‘0x2’ (File Not Found). To retrieve extended error information, call GetLastError. In the event the initialization file specified by lpFileName is not found, or contains invalid values, this function will set errorno with a value of ‘0x2’ (File Not Found). To retrieve extended error information, call GetLastError.

Последний параметр случайный, файл не существует. Но GetLastError() все равно возвращает 0. Может ли кто-нибудь объяснить мне, почему он не вернулся 2?

EDIT: Как @JochenKalmbach предложить, я гарантирую, что мой проект не использует C++/CLI. И @claptrap сказал, что errorno — это опечатка (это должно быть errno), я добавляю _get_errno в мой код выше. Но все же, весь код ошибки возвращается 0. Любая помощь очень ценится.

1 ответ

Надеюсь, вы не используете C++/CLI. это испортит значение «GetLastError», потому что код внутренне использует «IJW» (он просто работает) и выполняет кучу операций Win32.

В собственных приложениях это работает так, как ожидалось:

Если вы используете C++/CLI, вы должны окружить метод с помощью

Какова цель GetPrivateProfileString?

Я столкнулся с термином GetPrivateProfileString в программе на С ++. Может ли кто-нибудь дать мне простое объяснение использования этой функции?

код на моей странице:

Создан 07 сен. 11 2011-09-07 15:08:04 smurf

A C++ *** script ***? – Armen Tsirunyan 07 сен. 11 2011-09-07 15:10:03

Введите этот термин в своей любимой поисковой системе, вы получите официальные документы _fast_. – Mat 07 сен. 11 2011-09-07 15:10:22

Все те, кто закрыл этот вопрос, были непонятны в вопросе вопроса. Речь идет не о функции в случайной кодовой базе. Эта функция является API Microsoft Windows и противоречит аргументу ниже этого API, который присутствует во многих устаревших кодах. Таким образом, этот вопрос на самом деле, вероятно, будет иметь посетителей в будущем. – PoP 25 апр. 13 2013-04-25 12:07:22

4 ответа

GetPrivateProfileString() считывает значения из .ini файлов.

Обратный путь назад, когда в 16-разрядные версии Windows это был способ чтения и записи данных конфигурации приложения. Затем приложения сохраняли свою конфигурацию в общем файле .ini, который жил в системном каталоге, называемом win.ini. Плохие времена!

Чтобы прочитать из win.ini, вы позвонили GetProfileString() . Частное лицо в GetPrivateProfileString() свидетельствует о том, что эта замечательная функция позволила вам получить доступ к файлу .ini, отличному от win.ini, то есть к одному вашему приложению. Если я правильно помню (и моя память туманна), большинство приложений продолжалось с использованием win.ini годами и годами после того, как это было официально осуждено.

Так получилось, что GetPrivateProfileString() — это невероятно морщинистое зверь с ужасными характеристиками производительности и непонятными странностями. Я лично избегаю этого, как чума, и если мне нужно обработать файлы .ini, я использую код на заказ, чтобы сделать это.

Raymond Chen имеет приятный article о том, почему файлы .ini были устарели в пользу реестра.

Создан 07 сен. 11 2011-09-07 15:11:00 David Heffernan

+1 для не просто копирования в MSDN. Но я думаю, что ‘GetPrivateProfileString()’ фактически читается из частного файла .ini. Тот, о котором вы говорите, читает из общего файла Win.ini: ‘GetProfileString()’. – Praetorian 07 сен. 11 2011-09-07 15:23:47

@Praetorian Спасибо за это. Моя память туманна. Это было давно! Я обновил ответ, чтобы, надеюсь, он был более точным. – David Heffernan 07 сен. 11 2011-09-07 15:30:06

+1 Большое спасибо за ваше время и терпение @ Давид Хеффернан! – smurf 07 сен. 11 2011-09-07 15:42:54

Что такое код getprivateprofilestring

Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

19. Odi$$ey , 19.07.2001 17:48
Форум программистов > C++ > Visual C++
GetPrivateProfileString
Регистрация
Поиск по форуму
Расширенный поиск
К странице.

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru

Доброе время суток. Я здесь новичок поэтому не судите строго.
По быстрому введу в курс дела : делаю обработчик *.ini файлов.Возникла проблема с API функицией винды :

DWORD WINAPI GetPrivateProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpDefault,
__out LPTSTR lpReturnedString,
__in DWORD nSize,
__in LPCTSTR lpFileName
);

lpAppName — имя секции, в которой находится считываемй ключ. Если в качестве этого параметра передать NULL, функция вернет список всех секций в указанном INI-файле
lpKeyName — имя ключа, чье значение нужно считать. Если в качестве параметра передать NULL, то функция, по аналогии с секциями, вернет имена всех ключей в секции.
lpDefault — строка по умолчанию. Если в указанном INI-файле ключ lpKeyName не найден, то функция вернет это значение.
lpReturnedString — буфер, в который будут записаны возвращаемые функцией данные
lpFileName — имя считываемого INI-файла.

Как видно из описания ( на мсдн написано тоже самое) функция должна возвращать список всех секций в указанном INI-файле если lpAppName равно NULL. Так же должна возвращать список всех ключей в секции если аргумент lpKeyName — NULL.

А проблема собственно в том, что функция возвращает только 1ую секцию и 1ый ключ, если соответственный аргумент — NULL.

GetPrivateProfileString () возвращает пустую строку, несмотря на то, по умолчанию

December 2020

17.1k раз

но value содержит пустую строку !?

Я в признаваться в будучи n00b VB, менее чем через неделю, на самом деле, но я не могу увидеть , что случилось там. Файл существует, он содержит раздел под названием «Config» , который имеет запись под названием «UserName» со значением , — но даже если нет, то не будет value принимать по умолчанию?

(И нет, я не хочу, чтобы использовать реестр, спасибо ;-)

Edit: Это не возвращает пустую строку — это возвращение , что я инициализировать value на перед вызовом GetPrivateProfileString() .

Который должен сказать, что если я

то стил содержит «ххх» после вызова и не значение по умолчанию.

5 ответы

Инициализировать length и value следующим образом :

Кроме того , в соответствии с кодом размещен, IniFileName кажется пустым. Может быть , вам нужно присвоить значение там, а?

Убедитесь, что кодовый ваш INI-файл ANSI. Я получаю пустые результаты, потому что мой ини был в UTF-8.

Не было для меня очевидно.

Вы должны установить размер в Params и зарезервировать место для результата. Вставьте эти строки перед вызовом функции:

Забыл что — то: вы должны использовать возвращаемое значение функции, так как это длина фактического значения вы получаете, и использовать , Left(value,length) чтобы получить реальный ответ.

Вы также получите пустую строку, если ваш по умолчанию «» и вы предоставите имя файла, который не существует, или предоставить имя файла без полного пути. GetPrivateProfileString () не возвращает ошибку, если он не может найти исходный файл и просто использует по умолчанию.

Посмотрите на пример на Pinvoke.net , подпись вы используете для вызова GetPrivateProfileString это не совсем верно. В частности, подпись показана на Pinvoke.net проходит через StringBuilder и размера StringBuilder.

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

Для того, чтобы получить результат вы ожидаете, что ваш код, следовательно, должен быть:

ВИДЕОКУРС
выпущен 4 ноября!

Справочник можно смотреть от 1 до 50 справок на одну страницу, для этого в URL страницы вы можете править параметр &ln= на то число, которое вам удобнее, а также параметр ?pg= позволяет указать номер первой справки для вывода.

Всего на данный момент представлено 733 функций и сообщений WinAPI в справочнике

Если вы хотите прочитать «всё сразу», то пользуйтесь списком страниц по 50 справок по функциям WinAPI на каждой:

Ниже приведен полный список функций и сообщений WinAPI, подробности по которым вы можете узнать.

Какова цель GetPrivateProfileString?

Я столкнулся с термином GetPrivateProfileString в программе на С ++. Может ли кто-нибудь дать мне простое объяснение использования этой функции?

код на моей странице:

Создан 07 сен. 11 2011-09-07 15:08:04 smurf

A C++ *** script ***? – Armen Tsirunyan 07 сен. 11 2011-09-07 15:10:03

Введите этот термин в своей любимой поисковой системе, вы получите официальные документы _fast_. – Mat 07 сен. 11 2011-09-07 15:10:22

Все те, кто закрыл этот вопрос, были непонятны в вопросе вопроса. Речь идет не о функции в случайной кодовой базе. Эта функция является API Microsoft Windows и противоречит аргументу ниже этого API, который присутствует во многих устаревших кодах. Таким образом, этот вопрос на самом деле, вероятно, будет иметь посетителей в будущем. – PoP 25 апр. 13 2013-04-25 12:07:22

4 ответа

GetPrivateProfileString() считывает значения из .ini файлов.

Обратный путь назад, когда в 16-разрядные версии Windows это был способ чтения и записи данных конфигурации приложения. Затем приложения сохраняли свою конфигурацию в общем файле .ini, который жил в системном каталоге, называемом win.ini. Плохие времена!

Чтобы прочитать из win.ini, вы позвонили GetProfileString() . Частное лицо в GetPrivateProfileString() свидетельствует о том, что эта замечательная функция позволила вам получить доступ к файлу .ini, отличному от win.ini, то есть к одному вашему приложению. Если я правильно помню (и моя память туманна), большинство приложений продолжалось с использованием win.ini годами и годами после того, как это было официально осуждено.

Так получилось, что GetPrivateProfileString() — это невероятно морщинистое зверь с ужасными характеристиками производительности и непонятными странностями. Я лично избегаю этого, как чума, и если мне нужно обработать файлы .ini, я использую код на заказ, чтобы сделать это.

Raymond Chen имеет приятный article о том, почему файлы .ini были устарели в пользу реестра.

Создан 07 сен. 11 2011-09-07 15:11:00 David Heffernan

+1 для не просто копирования в MSDN. Но я думаю, что ‘GetPrivateProfileString()’ фактически читается из частного файла .ini. Тот, о котором вы говорите, читает из общего файла Win.ini: ‘GetProfileString()’. – Praetorian 07 сен. 11 2011-09-07 15:23:47

@Praetorian Спасибо за это. Моя память туманна. Это было давно! Я обновил ответ, чтобы, надеюсь, он был более точным. – David Heffernan 07 сен. 11 2011-09-07 15:30:06

+1 Большое спасибо за ваше время и терпение @ Давид Хеффернан! – smurf 07 сен. 11 2011-09-07 15:42:54

GetPrivateProfileString — C ++ класс — возвращенная строка — память предварительно расчет

В GetPrivateProfileString , lpReturnedString возвращает значение строки , присутствующие в ключе в определенном разделе ини файла.

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

Из вашего вопроса я полагаю , что вы хотите выделить память в куче с new , malloc , LocalAlloc или некоторыми другими функциями работы с кучей. Вы хотите , вероятно , использовать как меньше динамической памяти , как это возможно.

Если вы работаете с памятью на стеке это не так важно быть так точно. Распределение памяти является очень быстро (около 100 или 1000 раз быстрее , как в куче) и после возвращения из текущей функции память будет автоматически освобождена. Таким образом , вы можете просто определить переменную

16K в стеке нет почти ничего. После этого вы можете позвонить GetPrivateProfileString с szBuffer как lpReturnedString . Функция GetPrivateProfileString возвращает количество символов , скопированных в буфер. Если значение меньше 16К-1, то вы будете знать точный размер буфера. Можно выделить теперь блок памяти размером в куче и скопировать данные из szBuffer к блоку. Если возвращаемое значение GetPrivateProfileString равно 16К-1, то буфер был слишком мал. В случае , если вы можете реализовать любое удвоение размера буфера (и работа с буфером кучи сейчас), но я предпочитаю интерпретировать это как ошибку в ини-файле . Все реальноеINI-файлы, которые я использовал до этого было мало. Размер записи в основном менее 260 символов. Таким образом, размер записи терке, как 16К можно интерпретировать как ошибки.

Кстати , вы можете проверить размер INI-файл с уважением GetFileSizeEx . Размер записи должен быть меньше размера INI-файл.

Некоторые ограничения в INI-размера, вы должны включить в программу. Если размер записи будет измеряться в ГЗ, что вы можете сделать, получить проблему. Почему бы не ограничить размер разрешенного ввода с 16К, например?

Стандартный случай

Возвращаемое значение GetPrivateProfileString является количеством символов , скопированных в буфер, не включая нулевой терминатор.

Таким образом, вы могли бы начать с (скажем) буфер 100 _TCHAR с и проверить возвращаемое значение. Если это 99, то либо вы точно угадали размер строки или (более вероятно) ваш буфер слишком мал, поэтому увеличить ее и повторите попытку.

«Enumerating» случай

Выше относится к стандартному случае извлечения одного значения строки из .ini файла. Если вместо прохождения NULL или в виде lpAppName или lpKeyName параметров, для того , чтобы перечислить все возможные значения, и вы предоставили слишком маленькими из буфера, то возвращаемое значение будет два меньше , чем размер буфера.

Распределение Стратегия

Вы будете иметь , чтобы динамически выделять буфер. Таким образом , вы , вероятно , использовать std::auto_ptr или std::unique_ptr , или , может быть, std::vector что вы можете по resize() мере необходимости. Если вы не знаете заранее , насколько большой строка будет, я рекомендовал бы начать с чем — то вроде 250 _TCHAR с и удваивая размер каждый раз , когда вы обнаружите, буфер слишком мал. На практике, я бы поставил 250 достаточно 99,9999% времени.

альтернативы

XML файл , хранящийся под %APPDATA% ; JSON файл , хранящийся под %APPDATA% , в реестре .

Илон Маск рекомендует:  Анимация в CSS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
15.11.2011, 18:54 #1