Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с ini файлом / 15 сообщений из 15, страница 1 из 1
23.11.2003, 10:20
    #32332289
Luzin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Подскажите как на VC++ 6.0 считать все значения секций(можно одной секции) в ini файле.
Как считывать конкретное значение я знаю. Срочно надо.
...
Рейтинг: 0 / 0
23.11.2003, 17:22
    #32332405
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Platform SDK:
The GetPrivateProfileSectionNames function retrieves the names of all sections in an initialization file.

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

Код: plaintext
1.
2.
3.
DWORD GetPrivateProfileSectionNames(
  LPTSTR lpszReturnBuffer,  // return buffer
  DWORD nSize,              // size of return buffer
  LPCTSTR lpFileName);      // initialization file name


Parameters
lpszReturnBuffer
[out] Pointer to a buffer that receives the section names associated with the named file. The buffer is filled with one or more null-terminated strings; the last string is followed by a second null character.
nSize
[in] Specifies the size, in TCHARs, of the buffer pointed to by the lpszReturnBuffer parameter.
lpFileName
[in] Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter is NULL, the function searches the Win.ini file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.


The GetPrivateProfileSection function retrieves all the keys and values for the specified section of an initialization file.
Код: plaintext
1.
2.
3.
4.
DWORD GetPrivateProfileSection(
  LPCTSTR lpAppName,        // section name
  LPTSTR lpReturnedString,  // return buffer
  DWORD nSize,              // size of return buffer
  LPCTSTR lpFileName);      // initialization file name

Parameters
lpAppName
[in] Pointer to a null-terminated string specifying the name of the section in the initialization file.
lpReturnedString
[out] Pointer to a buffer that receives the key name and value pairs associated with the named section. The buffer is filled with one or more null-terminated strings; the last string is followed by a second null character.
nSize
[in] Specifies the size, in TCHARs, of the buffer pointed to by the lpReturnedString parameter.
Windows 95/98/Me: The maximum buffer size is 32,767 characters.

lpFileName
[in] Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.


Ну и пример, без всяких проверок
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <windows.h>
#include <tchar.h>
#include <iostream>

int main()
{
	TCHAR ini_file[] = _T( "C:\\Temp\\test.ini" );
	TCHAR keys[MAX_PATH];
	TCHAR snames[MAX_PATH];

	GetPrivateProfileSectionNames(snames, MAX_PATH, ini_file);
	for (TCHAR *psname = snames; *psname !=  0 ; psname += lstrlen(psname) +  1 )
	{
		std::cout << psname << '\n';
		GetPrivateProfileSection(psname, keys, MAX_PATH, ini_file);
		for (TCHAR *pkey = keys; *pkey !=  0 ; pkey += lstrlen(pkey) +  1 )
			std::cout << pkey << '\n';
	}
	return  0 ;
}
...
Рейтинг: 0 / 0
23.11.2003, 18:19
    #32332419
Shkurenko Alexander
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Кстати, этот вариант не будет работать с UNICODE. Замени std::cout на std::wcout или воспользуйся макросом _tprintf.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
09.11.2006, 08:13
    #34114298
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Доброго всем времени стуток.

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

Слышал, что есть библиотека по Си, которая работает с ini файлами. Не охото изобретать велосипед. Может кто подскажет, есть такая библиотека, и если есть, то какие функции в ней реализованы?

Содержание файла :

IN_PORT = 10100
REMOTE_PORT = 10200
REMOTE_IP = 192.168.250.126
TIME_OUT = 5000

Возможно есть какие то другие функици, для того что бы считать данный файл, получив значения числовых переменных?
...
Рейтинг: 0 / 0
09.11.2006, 09:50
    #34114499
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
посмотри в справке классы TRegIniFile, TRegistry
...
Рейтинг: 0 / 0
09.11.2006, 10:01
    #34114541
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
pandrewпосмотри в справке классы TRegIniFile, TRegistry

Так это в билдере, а мне нада для Си (обычный, не Си++)...
Может есть какой нибудь заголовочный файл? Может кто сталкивался?
...
Рейтинг: 0 / 0
09.11.2006, 11:07
    #34114904
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
LepajТак это в билдере, а мне нада для Си
тогда здесь
...
Рейтинг: 0 / 0
09.11.2006, 12:49
    #34115503
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
pandrew LepajТак это в билдере, а мне нада для Си
тогда здесь

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

Чтож, все равно спасибо.
...
Рейтинг: 0 / 0
09.11.2006, 13:00
    #34115575
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Lepaj pandrew LepajТак это в билдере, а мне нада для Си
тогда здесь

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

Чтож, все равно спасибо.

А чем не устраивает scanf ?
...
Рейтинг: 0 / 0
09.11.2006, 13:16
    #34115663
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
...
Рейтинг: 0 / 0
09.11.2006, 13:30
    #34115762
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
onstat-А чем не устраивает scanf ?

Я не понял ее синтаксиз, ей можно считать строку

IN_PORT = 10100
REMOTE_PORT = 10200
REMOTE_IP = 192.168.250.126
TIME_OUT = 5000

а потом не анализируя загнать 10100 в числовую переменную?

А вообще я реализовывал считывание через - fgets(str1, 10, fp); и переводил в число.

Но тогда в файле хранились только числовые значения,

10100
10200
192.168.250.126
5000

но начальник сказал, для юзера не удобно, так что переделай в вид приведенный выше :(
...
Рейтинг: 0 / 0
09.11.2006, 13:32
    #34115772
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
maXmo http://www.yandex.ru/yandsearch?rpt=rad&text=library+ini+files

Спасибо, что то я не додумался на английском написать.
...
Рейтинг: 0 / 0
09.11.2006, 14:48
    #34116262
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
fscanf(fp, "%s = %d\n", str1, &myint); - считывание числовых значений
fscanf(fp, "%s = %s\n", str1, str2); - считывание строковых
только надо строго за пробелами следить.
в str1 идёт имя параметра и там должно быть достаточно места для этого.
...
Рейтинг: 0 / 0
09.11.2006, 15:13
    #34116448
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
Lepaj onstat-А чем не устраивает scanf ?

Я не понял ее синтаксиз, ей можно считать строку

IN_PORT = 10100
REMOTE_PORT = 10200
REMOTE_IP = 192.168.250.126
TIME_OUT = 5000

а потом не анализируя загнать 10100 в числовую переменную?

А вообще я реализовывал считывание через - fgets(str1, 10, fp); и переводил в число.

Но тогда в файле хранились только числовые значения,

10100
10200
192.168.250.126
5000

но начальник сказал, для юзера не удобно, так что переделай в вид приведенный выше :(

Конечно можно
для целых это выглядит приблизительно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
char parname[ 100 ];
int   parvalue= 0 ;

int res=fscanf(f, "%99[^=]%*c%d%*[^\n]%*c", &parname[ 0 ],  &parvalue);
// описание используемого формата
//   %99[^=] - чтение 99 символов пока не встретися '=' 
//   %*c   -     пропусук '='
//   %d    -   чтение  int
//   %*[^\n] %*c  - перевод позиции на начало следующей строки 

if ( res != 2   ) // строка файла не соответствует формату  "параметр = значение"
{
.......
}

Для адресов, зависит от того в каких переменных вы их хотите видеть.

ps В имени параметра будут завершающие пробелы если они есть в файле
перед '='
...
Рейтинг: 0 / 0
10.11.2006, 11:29
    #34118745
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с ini файлом
maXmo и onstat - спасибо, это то что нужно :) Просто в документации, что у меня есть fscanf коряво описан :(
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с ini файлом / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]