Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дописать в середину текстового файла 
:(
    Опции темы
GQU
Дата 9.11.2015, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
math64
Дата 9.11.2015, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Прочитать весь файл в память.
Исправить тест в памяти
Записать в файл
Обрезать файл, если его размер стал меньше. 
PM   Вверх
GQU
Дата 9.11.2015, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



А как делают, если файл большой?
Этот способ затратный

Это сообщение отредактировал(а) GQU - 9.11.2015, 16:15
PM MAIL   Вверх
Alexeis
Дата 9.11.2015, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(GQU @  9.11.2015,  17:14 Найти цитируемый пост)
А как делают, если файл большой?
Этот способ затратный

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GQU
Дата 9.11.2015, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

а серединку пометить как свободный участок, который можно в последствии чем-то занять. 

а как записать в середину без перезаписи файла?
Как в моем случае сделать подобную файловую систему?

Это сообщение отредактировал(а) GQU - 9.11.2015, 17:55
PM MAIL   Вверх
Alexeis
Дата 9.11.2015, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(GQU @  9.11.2015,  18:49 Найти цитируемый пост)
а как записать в середину без перезаписи файла? 

  Перемещаешь файловый указатель в нужное место и вызываешь функцию записи. Но это будет не вставка, а запись поверх тех данных, что уже имеются ниже той позиции куда переместили. Если рассматривать чистый С++, то перемещается указатель следующим образом
https://msdn.microsoft.com/en-us/library/8dk8h81e.aspx


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GQU
Дата 9.11.2015, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

запись поверх тех данных, что уже имеются ниже той позиции куда переместили

так я об этом и говорю, чтоб не затирать придется данные которые там были отодвигать и еще раз записывать ниже
Цитата

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

имеете ввиду в большинстве случаев записывается в конец без перезаписи, но иногда и в середину, но тогда придется перезаписывать данные, которые ниже, так?



Это сообщение отредактировал(а) GQU - 9.11.2015, 18:02
PM MAIL   Вверх
Alexeis
Дата 9.11.2015, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GQU
Дата 9.11.2015, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

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

эту идею я понял
Я не совсем понял то что вы говорили про файловую систему

Это сообщение отредактировал(а) GQU - 9.11.2015, 18:44
PM MAIL   Вверх
Alexeis
Дата 9.11.2015, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(GQU @  9.11.2015,  19:11 Найти цитируемый пост)
эту идею я понял
Я не совсем понял то что вы говорили про файловую систему

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
math64
Дата 10.11.2015, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(Alexeis @  9.11.2015,  18:49 Найти цитируемый пост)
  Ну если файл внутри имеет некоторую разметку и блочную структуру (файл имеет определенный формат). Т.е. каждая последующая запись идет не за предыдущей, а по некоторому смещению, которое указывается или в предыдущей записи или в некотором заголовке. В этом случае чтобы изменить размер некоторой записи в середине файла, нужно просто эту запись переместить в конец, и указать правильное смещение в соответствующем заголовке.

А зачем это городить, если есть готовое?
Берите базу данных (например sqlite - не требует инсталяции, просто копируете exe+dll+базу данных на флешку), создаете таблицу, вставляете и удаляете записи как хотите.
PM   Вверх
xvr
Дата 10.11.2015, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(GQU @  9.11.2015,  16:14 Найти цитируемый пост)
А как делают, если файл большой?

Тогда не читают файл в память, а мэпируют. Далее memmove, копирование нужных данных в получившуюся дырку и unmap файла. Но по затратам это в принципе то же самое, что переписать хвост файла вручную, только ррудится будет ОС, а не пользовательская программа  smile 

PM MAIL   Вверх
math64
Дата 11.11.2015, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Второй способ работы с большим массивом данных, если база данных не устраивает, а вставлять в середину большого файла переписыванием хвоста файла - долго.
Вместо одного большого файла записываем данные в несколько маленьких, ограничивая их размер.
Новые данные дописывем в нужную часть, считывая и записывая весь файл. Если часть становится слишком большой, добавляем новую, переменовывая файлы с большими номерами.
Было (для примера - каждая часть - одна строка):
Код

part1.txt="Бан по Нику"
part2.txt="Бан по Ip"
part3.txt="Бан по SteamId"
part4.txt="SuperBan[Ip + Steam + Name]"
part5.txt="Бан подсетей"

Станет:
Код

part1.txt="Бан по Нику"
part2.txt="НИК_1"
part3.txt="НИК_2"
part4.txt="НИК_3"
part5.txt="Бан по Ip"
part6.txt="Бан по SteamId"
part7.txt="SuperBan[Ip + Steam + Name]"
part8.txt="Бан подсетей"

Если нужно объединить в один файл - можно использовать zip или другой архиватор.
Причем, даже распаковка архива "на лету" (т.е. без записи в файлы), внесение изменений и обратная упаковка (неизменяемые части можно не распаковывать, а просто переписывать) может занять меньше времени, чем перезапись хвоста незапакованного файла, но при разбиении на короткие части, как сделано в примере, толку от этого не будет.
PM   Вверх
GQU
Дата 11.11.2015, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 13.2.2011

Репутация: нет
Всего: нет



Цитата

Тогда не читают файл в память, а мэпируют. Далее memmove, копирование нужных данных в получившуюся дырку и unmap файла. Но по затратам это в принципе то же самое, что переписать хвост файла вручную, только ррудится будет ОС, а не пользовательская программа 

я пишу не на си++, на pawn, там нет функции memmove поэтому сделал обычным способом, с перезаписью данных
Цитата

Вместо одного большого файла записываем данные в несколько маленьких

так не пойдет, так мне неудобно работать будет, тогда пусть перезаписывает
Цитата

Берите базу данных (например sqlite - не требует инсталяции, просто копируете exe+dll+базу данных на флешку), создаете таблицу, вставляете и удаляете записи как хотите

не хочу заморочки, плагин делаю в один файл

Это сообщение отредактировал(а) GQU - 11.11.2015, 11:14
PM MAIL   Вверх
volatile
Дата 11.11.2015, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(GQU @  11.11.2015,  11:00 Найти цитируемый пост)
я пишу не на си++, на pawn, там нет функции memmove 

Там 10 строчек кода. Можно самому написать за 5 мин.
или взять готовую, коих в нете полно

Код

void *memmove(void *v_dst, const void *v_src, __kernel_size_t c)
{
        const char *src = v_src;
        char *dst = v_dst;

        if (!c)
                return v_dst;

        /* Use memcpy when source is higher than dest */
        if (v_dst <= v_src)
                return memcpy(v_dst, v_src, c);

        /* copy backwards, from end to beginning */
        src += c;
        dst += c;

        /* Simple, byte oriented memmove. */
        while (c--)
                *--dst = *--src;

        return v_dst;
}

взято от сюда

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0957 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.