.ini

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

ini-файл (англ. Initialization file) — это файл конфигурации, который содержит данные настроек для Microsoft Windows, Windows NT и некоторых приложений.

Появились с самых первых версий Windows. В версии Windows 1.01 это был только файл WIN.INI. В Windows 3.0 добавился файл SYSTEM.INI. А затем их количество начало расти быстро и бесконтрольно.

Не существует подробной официальной спецификации формата. Начиная с Windows 95, INI файлы считаются устаревшими и в качестве замены им Microsoft предлагает использовать системный реестр (Registry). Тем не менее INI файлы продолжают использоваться как приложениями других производителей, так и компонентами ОС от Microsoft. Например, файл boot.ini используется в Windows NT4/2000/XP при загрузке для выбора из нескольких ОС.

Хотя INI файлы и приобрели популярность в Windows, они могут использоваться в любой ОС. Несложная структура этого формата позволяет легко обрабатывать их программно и имеет достаточно понятный вид для чтения и изменения человеком. Существуют текстовые редакторы (например, SciTE или Notepad++), которые используют подсветку синтаксиса и фолдинг для этого формата, что облегчает редактирование INI файлов вручную.

Использование секций для разделения параметров способствует систематизации данных, однако для хранения настроек большого объёма с более сложной иерархической структурой лучше подходит формат XML.

Формат файла[править | править вики-текст]

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

; некоторый комментарий
# комментарий в стиле Unix

[Section1]
; комментарий о разделе
var1=значение_1 ; иногда допускается комментарий к отдельному параметру
var2=значение_2
  
[Section2]
var1=значение_1
var2=значение_2

; иногда позволяется перечислять несколько значений через запятую
[Section3]
var1=значение_1_1, значение_1_2, значение_1_3
var2=значение_2
; в Zend Framework массив задаётся следующим способом
[Section3.1]
var1[]=значение_1_1
var1[]=значение_1_2
var1[]=значение_1_3
var2=значение_2

; Иногда значения отсутствуют 
[Section4.0]
[ViewState]
Mode=
Vid=
FolderType=Generic

INI файл может содержать:

  • пустые строки;
  • комментарии — от символа «;» (точка с запятой) до конца строки;
  • заголовки разделов — строки, состоящие из названия раздела, заключённого в квадратные скобки «[ ]»;
  • значения параметров — строки вида «ключ=значение».

Соглашения[править | править вики-текст]

Не существует общепринятого стандарта формата файлов INI. Хотя общая структура таких файлов обычно сохраняется, многие программные продукты вводят в неё дополнительные возможности или, наоборот, ограничения.

  • Комментарии. Некоторые приложения (например, Samba) считают символом начала комментария как «;», так и «#».
  • Обратный слэш. Иногда допускается использование обратного слэша «\» для объявления следующей строки продолжением этой. В таком случае они будут обработаны как одна целая строка. Иногда возможно также применять «\» для ввода спецсимволов, например, '\n' для обозначения переноса строки.
  • Одинаковые параметры. В большинстве случаев наличие двух одинаковых ключей в одной секции запрещено (при этом обрабатывается только последний ключ).
  • Одинаковые имена секций. Обычно при наличии нескольких секций с одинаковыми именами в файле обрабатывается лишь последняя из них. Некоторые приложения объединяют содержимое всех таких секций в одну.

Пример реализации[править | править вики-текст]

Рассмотрим код, который обрабатывает заданный корректный ini-файл и выводит его в специальном виде:

 1 int main()
 2 {
 3 	freopen("input.txt", "r", stdin);
 4 	freopen("output.txt", "w", stdout);
 5 
 6 	int n;
 7 	cin >> n;
 8 	cin.get();
 9 	map <string, map <string, string>> mp;
10 	string from = "";
11 	for (int i = 0; i < n; i++)
12 	{
13 		string s;
14 		getline(cin, s);
15 		for (size_t j = 0; j < s.size();)
16 		{
17 			if (s[j] == ' ')
18 				s.erase(j, 1);
19 			else
20 				j++;
21 		}
22 		if (s.size() == 0 || s[0] == ';')
23 		{
24 			continue;
25 		}
26 		if (s[0] == '[')
27 		{
28 			s.erase(0, 1);
29 			s.erase(s.size() - 1, 1);
30 			from = s;
31 			mp[from];
32 		}
33 		else
34 		{
35 			mp[from][s.substr(0, s.find("="))] = s.substr(s.find("=") + 1, s.size() - s.find("="));
36 		}
37 	}
38 
39 	for (map < string, map <string, string >> :: iterator it = mp.begin(); it != mp.end(); it++)
40 	{
41 		if (it -> first != "")
42 		{
43 			cout << "[" << it -> first <<"]" <<  endl;
44 		}
45 		for (map < string, string >::iterator itt = mp[it -> first].begin(); itt != mp[it -> first].end(); itt++)
46 		{
47 			cout << itt -> first << "=" << itt -> second << endl;
48 		}
49 	}
50 
51 	return 0;
52 }

См. также[править | править вики-текст]

Ссылки[править | править вики-текст]