Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2015, 17:11   #1
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию Изменить байты в файле

Здравствуйте.
Есть файл (File of Byte) с данными (аналог БД), нужно поменять в нем по определенному адресу байты.
Знаю, что можно создать массив, записать в него все байты из файла, перезаписать в массиве нужные байты, и сохранить его заново. Но, проблема в том, что файл имеет большой размер, и такой способ требует много времени для выполнения.
Может быть, есть возможность поменять только нужные байты без полной перезаписи файла?
Alexan-Dwer вне форума Ответить с цитированием
Старый 05.08.2015, 17:17   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

http://www.delphibasics.ru/Seek.php
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 05.08.2015, 17:26   #3
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

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

Так не получается:
Код:
procedure SaveData;
var
T: Byte;
F: File of Byte;
begin
// Count определен ранее.
T:=Count + 1;

AssignFile(F, 'C:\bd.txt'); Rewrite(F);
Seek(F, 8);
Write(F, T); Seek(F, 2147483639);
CloseFile(F);
end;
Alexan-Dwer вне форума Ответить с цитированием
Старый 05.08.2015, 17:44   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор

Код:
procedure TForm1.Button1Click(Sender: TObject);
var stream : TFileStream;
     buff  : array[0..4095] of byte;
     i , count : integer;
begin
   stream := TFileStream.Create(имя файла, fmOpenReadWrite);
   while stream.Position<stream.size do
   begin
      FillChar(buff[0], sizeof(buff), 0);
      count := min(sizeof(buff), stream.size-stream.Position);
      stream.read(buff, count);
      for i:=0 to count-1 do
      if buff[i] in [12,65,76,32,0] then
       buff[i] := ord(' '); // меняем на пробелы
       // возвращаемся
      stream.seek(-count, soFromCurrent);
      // пишем
      stream.write(buff, count);
   end;
   stream.Free;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 05.08.2015, 17:58   #5
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

JUDAS, TFileStream это класс, который описан во внешнем unit-файлы, не хотелось бы на WinApi использовать лишние unit'ы из-за одного класса. Плюс, сомневаюсь, что FileStream не перезаписывает заново весь файл :/

P.S. Может есть какая-то возможность решить хотя бы на Assembler'e, если на чистом Pascal'е такой возможности нет?
Alexan-Dwer вне форума Ответить с цитированием
Старый 05.08.2015, 20:55   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Alexan-Dwer Посмотреть сообщение
если на чистом Pascal'е такой возможности нет?
Автор, никогда так не говори. Лучше напиши - я не знаю

Код:
program Project1;

{$APPTYPE CONSOLE}

 procedure ReplaceInAddress(const FileName : string;
    address : longint; value : byte);
 var _file: file of byte;
 begin
    Assign(_file, FileName);
    reset(_file);
    Seek(_file, address);
    Write(_file, value);
    Close(_file);
 end;

begin
  ReplaceInAddress('d:\книжечка.djvu', $100, $FF);


end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 05.08.2015, 21:41   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Если программа написана на чистом WinAPI, т.е. VCL-юниты не используются нигде и размер ехе мизерный, то вот есть такая функция в пакете delphi works:
Код:
procedure dwPatchFile(Filename: String; Data: array of Byte; Offset, Count: LongInt);
var
  f: File;
begin
  AssignFile(f, Filename);
  {$i-}
  Reset(f, 1);
  {$i+}
  if IoResult <> 0 then exit;
  Seek(f, Offset);
  BlockWrite(f, Data, Count);
  CloseFile(f);
end;
A ещё лучше - юзай ядрёные файловые функции:
- OpenFile();
- SetFilePointer();
- WriteFile().
Хватит насиловать мёртвый паскакаль! Паскальными IO-функциями можно дербанить файлы не более 4 Гб.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось Stilet; 06.08.2015 в 09:24.
min@y™ вне форума Ответить с цитированием
Старый 06.08.2015, 10:09   #8
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

JUDAS, min@y™, большое спасибо Вам!
Использовал код, который написал JUDAS и всё получилось...

Цитата:
Сообщение от JUDAS
Автор, никогда так не говори. Лучше напиши - я не знаю
Я думал, что нужен более низкий уровень (указатели, прерывания...) для решения такой задачи, поэтому стал писать про Assembler. Найти информацию о том, как это реализовать на Паскале у меня не получилось

Цитата:
Сообщение от min@y™
юзай ядрёные файловые функции
Спасибо, буду учить!

Еще раз, большое спасибо за помощь
Alexan-Dwer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить переменную в .exe файле извне CantStop0708 Visual C++ 2 12.01.2013 14:42
Изменить кодировку в файле Ecosasha Свободное общение 0 20.08.2011 13:24
Как программно изменить CheckBox в файле Excel Sharmon Общие вопросы Delphi 10 23.06.2011 15:02
Изменить информацию в файле на сайте! ftp KWN, lnc Работа с сетью в Delphi 2 20.02.2010 17:32
Помогите заменить байты в файле Dax Общие вопросы Delphi 3 21.06.2007 10:24