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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2016, 15:43   #1
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию Вопрос по записи в файл

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



Нужно например заменить второй байт на FF
Чтоб получилось так:



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

Как это можно сделать программно, прошу Вашей помощи.
denis76560 вне форума Ответить с цитированием
Старый 17.08.2016, 15:45   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

используйте TFileStream

примерно так:

Код:
          fs := TFileStream.Create(FileName,   fmOpenReadWrite or fmShareExclusive);
          fs.Position := 1;
          fs.Read(Buf,1);
          if Buf=$32 then begin
            Buf := $FF;
            fs.Position := 1;
            fs.write(Buf,1);
          end;
          fs.Free;

Цитата:
но это не то что мне нужно, так как мне перед этим нужно прочитать файл в память, заменять файл нужно уже именно памяти, только потом уже записывать на диск.
ой, простите. я именно это и предложил Вам.

а что значит - прочитать файл в память?
Код:
var Buf : array of byte;
так?

ну так прочитайте:
Код:
SetLength(Buf, fs.size);
fs.Read(Buf[0], fs.size);
поменять в памяти:

Код:
Buf[1] := $FF;
только непонятно, зачем переписывать много байт, если нужно поменять только один.

Ну и если файлик будет многогиговый, надо много времени и памяти, чтобы его полностью прочитать.

Смысл какой в этом?

Последний раз редактировалось Serge_Bliznykov; 17.08.2016 в 15:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.08.2016, 16:45   #3
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

копнул в сторону TFilestream как вы изначально и предложили, пробовал сделать так

Код:
var
Data:  Byte;
i:Integer;
begin
  Data:=$FF;

  fss1:= TFilestream.Create('c:\1.txt', fmOpenRead);

  for i:= 1 to 3 do
  begin
  fss2:= TFilestream.Create('C:\Users\Denis\Desktop\'+inttostr(i)+'.txt', fmCreate);
  fss2.CopyFrom(fss1,fss1.Size);
  fss2.Position:=i;
  fss2.WriteBuffer(Data, 1);
  fss2.Free;
  end;

  fss1.Free;
end;
Но при второй попытке чтения попытке чтения stream (в выделенной строке) происходит ошибка

То есть первый файл 1.txt создается измененный как и положенно а вот дальше программа встает с ошибкой. Ппробовал выносить fss2.Free; за пределы цикла - увы не помогло.
denis76560 вне форума Ответить с цитированием
Старый 17.08.2016, 16:56   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

fss1 позицию в 0 перед копированием?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.08.2016, 17:00   #5
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Спасибо Вам обоим, разобрался с Вашей помощью =)
denis76560 вне форума Ответить с цитированием
Старый 18.08.2016, 08:03   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Но TFileStream это не память. Это файл. Раз хотите именно в памяти, то используйте например TMemoryStream
FaTaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить mysql на файл (вместо записи в БД записывать в текстовый файл) прак PHP 2 16.12.2015 23:21
Записи в файл. MiaKotova Общие вопросы Delphi 3 14.07.2015 10:04
Создать файл студент. Из файла студент занесите в отдельный файл записи об отличниках MrDeura Паскаль, Turbo Pascal, PascalABC.NET 2 26.05.2015 21:05
Вопрос по записи в файл arcer Общие вопросы C/C++ 1 14.08.2010 19:13
Вопрос по записи в БД Rootz БД в Delphi 1 11.05.2008 00:56