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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перезаписать файл игнорируя первые N байт 
:(
    Опции темы
Xenp
Дата 21.9.2014, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть к примеру файл с содержимым:
Код

{FUN:1234567890:1234567890}*FILEFILEFILEFILEFILEFILEFILEFILE
FILEFILE
FILEFILEFILEFILEFILEFILEFILEFILE
FILE

Задача: Записать в переменную "{FUN:1234567890:1234567890}" и удалить из файла.

Прочитать я смог, я вот с удалением пошли проблемы:

Код

FILE * pFile;
char *buffer;
AnsiString result;
long lSize;

pFile = fopen ( "1" , "r+" );
if (pFile==NULL) exit (1);

for (int i = 1; i <= 28; i++)
{
    for (int f = 0; f < result.Length(); f++)
    {
        if (result.SubString(f,1) == "}")
        {
            result = result.SubString(0,f);
            goto end_fread;
        }
    }
    rewind (pFile);
    buffer = (char*) malloc (sizeof(char)*(SIZE_BUFF_READ*i));
    fread (buffer,1,SIZE_BUFF_READ*i,pFile);
    result = (char *)buffer;
    free (buffer);
}
end_fread:

fseek (pFile,0,SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
for (int i = 1; i <= lSize; i += 32)
{
    if (i > lSize)    i = i - lSize;

    fseek (pFile ,i-1+result.Length(), SEEK_SET );
    buffer = (char*) malloc (sizeof(char)*(i*32));
    fread (buffer,1,(i*32),pFile);

    fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
    free (buffer);
}
free (buffer);
fclose (pFile);

В итоге все осталось на своих местах, только в конец он добавил какую то кашу из символов...

Как исправить?

Добавлено через 1 минуту и 34 секунды
Выражение "{FUN:1234567890:1234567890}" всегда в начале файла, но его длина может отличатся

Добавлено через 2 минуты и 44 секунды
Длинна записана в result.Length() 
PM MAIL   Вверх
LeonidPr
Дата 21.9.2014, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 17.2.2012
Где: г. Чебоксары

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



Вычитываете из файла то что нужно удалить. затем создаете новый файл со случайным именем (он будет временным), читаете из исходного файла и пишете в результирующий то что должно в итоге остаться. далее закрываете оба дескриптора, удаляете исходный файл, а временный переименовываете. я так предлагаю, вроде как достаточно простой подход.
--------------------
pkunzip.zip
PM MAIL   Вверх
Xenp
Дата 21.9.2014, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(LeonidPr @ 21.9.2014,  22:21)
Вычитываете из файла то что нужно удалить. затем создаете новый файл со случайным именем (он будет временным), читаете из исходного файла и пишете в результирующий то что должно в итоге остаться. далее закрываете оба дескриптора, удаляете исходный файл, а временный переименовываете. я так предлагаю, вроде как достаточно простой подход.

Вполне годно до каких то пор, но что делать если файл окажется размером скажем в 20Гб
В итоге я из-за каких то максимум 28 байт, должен расположится в 40 Гб если конечно вообще места хватит...

Может есть какой нибудь более менее лучшей способ?

Это сообщение отредактировал(а) Xenp - 21.9.2014, 22:24
PM MAIL   Вверх
NoviceF
Дата 22.9.2014, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



Цитата(Xenp @  21.9.2014,  23:23 Найти цитируемый пост)

Может есть какой нибудь более менее лучшей способ?

Есть платформозависимые способы типа truncate для posix. Отображаешь файл в память, находишь конец искомой фразы, и весь оставшийся файл копируешь на начало файла используя memmove, синхронизируешь память с файлом fsync, обрезаешь файл при помощи truncate. Не уверен, что это будет работать, но можешь во всяком случае подумать в этом направлении.
PM MAIL   Вверх
math64
Дата 22.9.2014, 11:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Работать будет, но в сучае сбоя файл будет не восстановить. Поэтому, если есть свободное место, лучше работать с временным файлом.
PM   Вверх
Vasya
Дата 14.10.2014, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну, а если в огромном файле хранятся данные маленького размера, можно где-то хранить описание файла, что и где записано, что считать мусором, и куда можно записать новые данные. Правда, реализация немного усложняется  smile  
PM MAIL   Вверх
bsa
Дата 21.10.2014, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Vasya @  14.10.2014,  20:38 Найти цитируемый пост)
Ну, а если в огромном файле хранятся данные маленького размера, можно где-то хранить описание файла, что и где записано, что считать мусором, и куда можно записать новые данные.
В итоге получится своя файловая система.  smile 

Xenp, если есть возможность, то надо проектировать программу таким образом, чтобы большие файлы были разделены на кучу/несколько маленьких, в которых не предусмотрена операция удаления из середины файла (с конца это сделать реальней). Если по каким-то причинам это невозможно, то остается только два способа: через копирование в новый файл (долго, много ресурсов) или через организацию аналога файловой системы.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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