|
Запись, дозапись данных в текстовый файл
|
|
| Rockon | Дата: Пятница, 19.12.2008, 17:30:36 | Сообщение # 1 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| Здравствуйте. Меня вот интересует, как можно дозаписать в текстовый файл нужную мне информацию если она отсутствует. Т.е. есть у меня файл и в нём строка как мне сделать так, чтобы при наличии допустим этого текста, плагин не дозаписывал его ещё раз? Дело то в том, что файл будет большой и читать конкретную строку не получится. Тут надо будет считывать весь файл и при ненахождении(в моём случае на отдельной строке) дозаписывать это на последнюю строку.. Как это реализовать?
|
| |
|
|
| draft | Дата: Суббота, 20.12.2008, 03:59:32 | Сообщение # 2 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| Единственный вариант такой: - Создаёшь буфер вида nadpis[кол-во_строк][длина_надписи] counter // ака номер строки - В начале плагина ты считываешь в этот буфер построчно все строки, попутно увеличиваешь счётчик - Затем при каждой записи сверяешь с буфером, и дальше либо пишешь в файл и буфер (увеличивая счётчик), либо не пишешь.
|
| |
|
|
| Rockon | Дата: Суббота, 20.12.2008, 04:16:13 | Сообщение # 3 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| а поподробнее с кодом можно? как мне считывать каждый раз новую строку? Количество строк всегда разное, ибо у каждого свой конфиг.
Сообщение отредактировал Rockon - Суббота, 20.12.2008, 04:18:37 |
| |
|
|
| draft | Дата: Суббота, 20.12.2008, 19:32:36 | Сообщение # 4 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| Не понял, ты считываешь из одного файла или из каких-то разных? Если ты не хочешь, чтобы строка повторялась в трёх файлах, то просто последовательно записываешь построчно в буфер все три файла, а затем также сверяешь. Какой конкретно код интересует? Вкратце, в plugin_cfg() ты делаешь while(read_file(...)), то бишь, пока мы не достигнем конца файла, построчно записываешь, например, через copy(nadpis[counter], 100, stroka) в буфер и после записи увеличиваешь счётчик counter++ (если файл один, то counter совпадает с номером строки, но лучше делать для надёжности line++) А дальше, если надо записать, создаёшь проверочную функцию и циклом проверяешь, есть ли в буфере такая строка Code for(i = 0; i <= counter; i++) { if(equali(nadpis[i], novaya_nadpis)) return 0 } return 1 Получив, циферку 1 в дочерней, ты можешь в родительской функции сделать write_file(file, novaya_nadpis) и, не забудь, Code counter++ copy(nadpis[counter], 100, novaya_nadpis)
Сообщение отредактировал draft - Суббота, 20.12.2008, 19:33:31 |
| |
|
|
| Rockon | Дата: Воскресенье, 21.12.2008, 12:33:57 | Сообщение # 5 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| файл один. Просто у каждого юзера он свой. Нужно в этом файле найти определённую строчку, в которой должна быть одна надпись(почему нельзя последовательно считывать строчку, каждый раз её сверять и при несовпадении очищать память? Иначе получается он будет жутко кушать её. А если на сервере 16 человек, как у меня?). Сама надпись Если он не находит в файле данную надпись - то он её должен дозаписать на последнюю строчку, тобишь в конец файла
Сообщение отредактировал Rockon - Воскресенье, 21.12.2008, 12:35:48 |
| |
|
|
| draft | Дата: Воскресенье, 21.12.2008, 14:29:45 | Сообщение # 6 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| А как ты, вообще, узнаёшь, из какого файла надо считывать? Вот как раз, если ты будешь постоянно считывать из файла, а не из буфера памяти, тогда у тебя и появятся нереальные лаги.
|
| |
|
|
| Rockon | Дата: Понедельник, 22.12.2008, 00:22:34 | Сообщение # 7 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| файл тот - materials.txt лежит в папке sound
|
| |
|
|
| draft | Дата: Понедельник, 22.12.2008, 00:43:08 | Сообщение # 8 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| Это файл на клиенте или на сервере? Потому что на сервере (если я правильно понял) он может быть только один, а на клиенте ты ничего считывать через AMX не сможешь.
|
| |
|
|
| Rockon | Дата: Понедельник, 22.12.2008, 08:18:16 | Сообщение # 9 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| файл на клиенте и находится в дирректории cstrike\sound Разве не могу? Это же текстовый файл. Хорошо, тогда если не могу чтением файла, то тогда стоит ввести переменную свою. например amx_texture Тогда такой вопрос: Я создам свой конфиг, где пропишу только одно как мне перезаписывать конфиг? Т.е. в теории мне надо: Если amx_texture 0 мой текст дозаписывается в materials.txt в конец файла и amx_texture меняется на 1(при этом идёт перезапись в конфиг) Так вот как мне с нуля перезаписывать конфиг. Т.е. не добавлять на последнюю строчку, а стирать его полностью и записывать ещё раз эту переменную?
Сообщение отредактировал Rockon - Понедельник, 22.12.2008, 09:04:47 |
| |
|
|
| draft | Дата: Понедельник, 22.12.2008, 20:14:11 | Сообщение # 10 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| К сожалению, стирать, а точнее, перезаписывать на клиенте файлы возможно только одним способом - командой "writecfg" (и понятно, что это будет на выходе не *.txt, а *.cfg и притом редактировать ты его никак не сможешь). txt файл можно только закачивать через precache, но ты не узнаешь, закачал он его или он уже есть на клиенте, поэтому amxmodx здесь бессилен, в первую очередь, из-за особенностей движка самой халфы.
Сообщение отредактировал draft - Понедельник, 22.12.2008, 20:15:04 |
| |
|
|
| Rockon | Дата: Вторник, 23.12.2008, 12:22:14 | Сообщение # 11 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| А если это будет плагин под метамод? В таком случае я смогу обойти блокировку? Или переименовать файл txt в cfg средствами амхх мода?
Сообщение отредактировал Rockon - Вторник, 23.12.2008, 12:24:15 |
| |
|
|
| draft | Дата: Среда, 24.12.2008, 12:31:38 | Сообщение # 12 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| Metamod также ограничен движком, как и amxmodx Переименовать ты можешь что угодно в файлах сервера, а клиенту ты можешь лишь что-то закачать через plugin_precache(), либо сохранить конфиг через writecfg на клиенте.
|
| |
|
|
| Rockon | Дата: Четверг, 25.12.2008, 01:18:53 | Сообщение # 13 |
 Подполковник
Группа: Скриптеры
Сообщений: 137
Статус: Не в сети
| чорт, там прописываются текстуры, так что тут надо именно в txt Я маппер)
|
| |
|
|
| draft | Дата: Четверг, 25.12.2008, 01:37:38 | Сообщение # 14 |
 Полковник
Группа: Пользователи
Сообщений: 225
Статус: Не в сети
| К сожалению, был вынужден тебя огорчить
|
| |
|
|