Поиск:

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


Опытный
**


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

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



Добрый день!

Есть бинарный файл, который записывается структура. Есть к примеру 20 "строк" записей этой структуры в файле. Как удалить, к примеру, 5-ю строку из этого файла?

Это сообщение отредактировал(а) SerK - 19.6.2009, 12:18


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
mrbrooks
Дата 19.6.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



SerK, интересно, а как выглядят строки в бинарном файле? Каков их критерий?
PM MAIL   Вверх
SerK
Дата 19.6.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mrbrooks

Слово "строка" я не даром написал в кавычках, смысл вопроса по-моему понятен, - нужно удалить запись из файла, чтобы было еще более понятно, привожу код:

Код


struct Data
{
 char Name[20];
};

//-----------------------
private:
Data data;

//-------------------------------------
void __fastcall TForm1::WriteParam(String FileName,int params)
{
//запись данных в файл
TFileStream *fs=new TFileStream(FileName, fmOpenReadWrite);
for (int i=0;i<20;i++)
{StrCopy(data.Name,(im->Canvas->Font->Name).c_str()); 
 fs->Write(&data,sizeof(Data));
}
delete fs;
}


Теперь в файле FileName мы (образно говоря) имеем 20 "строк" или, кому как понятней, записей.
Надеюсь в этом фрагтменте все ясно?
Теперь, к примеру, мне нужно удалить 5-ю запись. 
Как мне это сделать?


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
mrbrooks
Дата 19.6.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(SerK @  19.6.2009,  13:08 Найти цитируемый пост)
Как мне это сделать? 

1. Понятно - в самом файле ты запись не удалишь. Поэтому не обойтись без временного файла.
2. Решений много. У тебя структура всегда 20 байт.Пятая запись соответсвенно начнется с 80 позиции на 20 байт. Тогда если брать за основу твой код:

Код

#include<memory>

struct Data
{
 char Name[20];
};
//-----------------------
private:
Data data;
//-------------------------------------
void __fastcall TForm1::WriteParam(String FileName,int params)
{
//запись данных в файл
std::auto_ptr<TFileStream>fs(new TFileStream(FileName, fmOpenReadWrite));
for (int i=0;i<20;i++)
{
  StrCopy(data.Name,(im->Canvas->Font->Name).c_str()); 
  fs->Write(&data,sizeof(Data));
}
std::auto_ptr<TFileStream>fs_cpy(new TFileStream("copy_file", fmCreate));
char ch[1];
fs->Seek(0, soFromBegin);
while (fs->Read(&ch,1))
{
   fs_cpy->Write(&ch,1);
   if (fs->Position == 80) fs->Seek(100, soFromBegin);
}

}


Добавлено @ 13:57
грубо говоря те двадцать байт которые являются пятой записью ты пропускаешь.

Это сообщение отредактировал(а) mrbrooks - 19.6.2009, 13:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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