![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
GQU |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
Можно ли дописать в середину текстового файла, не создавая его заново?
То, что есть Бан по Нику Бан по Ip Бан по SteamId SuperBan[Ip + Steam + Name] Бан подсетей То, что должно стать Бан по Нику НИК_1 НИК_2 НИК_3 Бан по Ip Бан по SteamId SuperBan[Ip + Steam + Name] Бан подсетей Это сообщение отредактировал(а) GQU - 9.11.2015, 15:52 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Прочитать весь файл в память.
Исправить тест в памяти Записать в файл Обрезать файл, если его размер стал меньше. |
|||
|
||||
GQU |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
А как делают, если файл большой?
Этот способ затратный Это сообщение отредактировал(а) GQU - 9.11.2015, 16:15 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Создаешь временный файл. Все что ниже места вставки копируешь в него, дописываешь чего нужно по месту вставки и дописываешь содержимое временного файла после того места где закончилась новая запись. Вообще с большими файлами стараются так не работать. В больших файлах делают что-то типа файловой системы, чтобы можно было дописать в конец, а серединку пометить как свободный участок, который можно в последствии чем-то занять. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
GQU |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
а как записать в середину без перезаписи файла? Как в моем случае сделать подобную файловую систему? Это сообщение отредактировал(а) GQU - 9.11.2015, 17:55 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Перемещаешь файловый указатель в нужное место и вызываешь функцию записи. Но это будет не вставка, а запись поверх тех данных, что уже имеются ниже той позиции куда переместили. Если рассматривать чистый С++, то перемещается указатель следующим образом https://msdn.microsoft.com/en-us/library/8dk8h81e.aspx -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
GQU |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
так я об этом и говорю, чтоб не затирать придется данные которые там были отодвигать и еще раз записывать ниже
имеете ввиду в большинстве случаев записывается в конец без перезаписи, но иногда и в середину, но тогда придется перезаписывать данные, которые ниже, так? Это сообщение отредактировал(а) GQU - 9.11.2015, 18:02 |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Самое простое представление для файла это магнитофонная кассета (или бобина). Кассета это файл. Чтобы записать что-то нужно перемотать кассету в нужную позицию и подать на записывающую головку данные. Данные можно писать поверх данных, но вклеить кусочек пленки нельзя.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
GQU |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
эту идею я понял Я не совсем понял то что вы говорили про файловую систему Это сообщение отредактировал(а) GQU - 9.11.2015, 18:44 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Ну если файл внутри имеет некоторую разметку и блочную структуру (файл имеет определенный формат). Т.е. каждая последующая запись идет не за предыдущей, а по некоторому смещению, которое указывается или в предыдущей записи или в некотором заголовке. В этом случае чтобы изменить размер некоторой записи в середине файла, нужно просто эту запись переместить в конец, и указать правильное смещение в соответствующем заголовке. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
А зачем это городить, если есть готовое? Берите базу данных (например sqlite - не требует инсталяции, просто копируете exe+dll+базу данных на флешку), создаете таблицу, вставляете и удаляете записи как хотите. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Тогда не читают файл в память, а мэпируют. Далее memmove, копирование нужных данных в получившуюся дырку и unmap файла. Но по затратам это в принципе то же самое, что переписать хвост файла вручную, только ррудится будет ОС, а не пользовательская программа ![]() |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Второй способ работы с большим массивом данных, если база данных не устраивает, а вставлять в середину большого файла переписыванием хвоста файла - долго.
Вместо одного большого файла записываем данные в несколько маленьких, ограничивая их размер. Новые данные дописывем в нужную часть, считывая и записывая весь файл. Если часть становится слишком большой, добавляем новую, переменовывая файлы с большими номерами. Было (для примера - каждая часть - одна строка):
Станет:
Если нужно объединить в один файл - можно использовать zip или другой архиватор. Причем, даже распаковка архива "на лету" (т.е. без записи в файлы), внесение изменений и обратная упаковка (неизменяемые части можно не распаковывать, а просто переписывать) может занять меньше времени, чем перезапись хвоста незапакованного файла, но при разбиении на короткие части, как сделано в примере, толку от этого не будет. |
||||
|
|||||
GQU |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 13.2.2011 Репутация: нет Всего: нет |
я пишу не на си++, на pawn, там нет функции memmove поэтому сделал обычным способом, с перезаписью данных
так не пойдет, так мне неудобно работать будет, тогда пусть перезаписывает
не хочу заморочки, плагин делаю в один файл Это сообщение отредактировал(а) GQU - 11.11.2015, 11:14 |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Там 10 строчек кода. Можно самому написать за 5 мин. или взять готовую, коих в нете полно
взято от сюда |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |