04.12.2009, 14:46
если я правильно понял, то в этом примере секции нужны только, чтобы при ручном редактировании видеть разные группы ключей. Не в одной из этих групп нет одинаковых ключей! Т.е. в этом примере ваще использование секций не только не оправдано, оно вовсе не нужно. Чтобы вручную редактировать и знать в каком месте какие группы значений находятся - достаточно
где, слова большими буквами это комменты. Или вовсе подойдет
причем, все равно будет ясно, что хранит каждый ключ.
Кстати, заметили, что INI ридер/райтер не создает файлы, если они не существуют? Это большой плюс, объясню почему: если нужен специальный формат INI файла, который еще не существует, то достаточно создать в моде строку с этим самым форматом, создать новый файл с помощью fopen и записать в открытый файл эту строку, далее файл закрыть.
Покажу на примере, как можно добиться нужного формата файлов.
Теперь при регистрации будет сразу же создаваться файл аккаунта со стандартными настройками. Такой файл будет читать/писать любой INI ридер/райтер и мой тем более (: . В итоге получен нужный результат без всяких секций.
Код:
ИГРОК ники = cookies время = 0 ссылки = пароль = lol СТАТИСТИКА убийств = 0 смертей = 10 СОХРАНЕНО жись = 85.000000 бронь = 0.000000
Код:
ники = cookies время = 0 ссылки = пароль = lol убийств = 0 смертей = 10 жись = 85.000000 бронь = 0.000000
Кстати, заметили, что INI ридер/райтер не создает файлы, если они не существуют? Это большой плюс, объясню почему: если нужен специальный формат INI файла, который еще не существует, то достаточно создать в моде строку с этим самым форматом, создать новый файл с помощью fopen и записать в открытый файл эту строку, далее файл закрыть.
Покажу на примере, как можно добиться нужного формата файлов.
Код:
// это формат файла для аккаунтов игроков #define accountFileFormat \ "[PLAYER]\r\n\ nicks=%s\r\n\ time=%d\r\n\ links=%s\r\n\ password=%s\r\n\ \r\n\ [STATS]\r\n\ kills=%d\r\n\ deaths=%d\r\n\ \r\n\ [SAVED]\r\n\ hp=%.2f\r\n\ ap=%.2f" public OnPlayerCommandText ( playerid, cmdtext[] ) { if ( strcmp( cmdtext, "/register", true, 9 ) == 0 ) // если игрок ввел в чате /register { new regName[20]; GetPlayerName( playerid, regName, 20 ); // узнаем ник игрока if ( fexist(regName) ) // если файл для этого ника уже существует { SendClientMessage( playerid, 0xFF00000AA, " * Этот аккаунт уже зарегистрирован! Выбери другой ник." ); return 1; } if ( cmdtext[9] == 0 || cmdtext[10] == 0 ) // если не указан пароль { SendClientMessage( playerid, 0xFF00000AA, " * Не указан пароль! Формат: /register пароль" ); return 1; } new File: pFile = fopen( regName, io_write ); // создадим файл с именем игрока if ( pFile ) // если файл создан { new playerFileContent[255]; // создадим и сформируем строку для записи со стандартными значениями файла format( playerFileContent, 255, accountFileFormat, "", 0, "", cmdtext[10], 0, 0, 100.0, 0.0 ); fblockwrite( pFile, playerFileContent ); // запишем строку в файл fclose( pFile ); // закроем файл SendClientMessage( playerid, 0x00FF00AA, " * Аккаунт успешно зарегистрирован! Используй /login, чтобы войти в него." ); return 1; } // если не удалось создать файл SendClientMessage( playerid, 0xFF00000AA, " * Не удалось создать файл для аккаунта! Попробуй еще раз. " ); return 1; } return 0; }