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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2022, 00:45   #271
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
BDA, это не совсем то , скажем что заполнения не всего файла, а определённого адреса, который задан как тут например : inc(p, $10);
for i := 1 to 100 do
begin
p^ := $00;
inc(p);
end
Только по одному адресу , остальные игнорятся.

И вообще , есть что то подобное, адресное для TFileStream; ?
Бывает что только один адрес нужно затереть, а не всё.

И как я понял это пишет только для FF, а если для 00 нужно?
Что то универсальное бы и простое типа как выше в примере. Только для TFileStream?
Цитата:
Сообщение от BDA Посмотреть сообщение
Да, можно. Добавить ранее упоминавшийся код перед считыванием:
При таком коде, данные не записывает, в выходном файле , одни FF , а данные где?
Нет, не подходит такой вариант, нужен адресный и чтоб данные не терялись, а просто по определённому адресу после считывания данных, записывались 00.

Только типа такого,
Код:
begin
p := Stream.Memory;
inc(p, $010);
for i := 1 to 71 do
begin
p^ := $00;
inc(p);
end;
но под TFileStream.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 04:01   #272
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
При таком коде, данные не записывает, в выходном файле , одни FF , а данные где?
Я код не запускал, но должно было записать каждый диапазон 2 раза: сначала диапазон со старыми адресами полностью из FF, затем диапазон с новыми адресами с данными из старого диапазона.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
И как я понял это пишет только для FF, а если для 00 нужно?
Нужно исправить две строки. Подсказка, вот эти:
Код:
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF + $FF * read_count;
data_s := StringOfChar('F', 2 * read_count);
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
И вообще , есть что то подобное, адресное для TFileStream; ?
Бывает что только один адрес нужно затереть, а не всё.
TMemoryStream загружает данные из файла в память. Поэтому можно её напрямую редактировать. А с TFileStream придется "бегать" по самому файлу и писать данные в файл (меняя Position и делая Write). Но у вас-то не такая ситуация, бинарный файл открывается только на чтение, и из него берутся какие-то данные для записи в текстовый файл.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.02.2022, 07:55   #273
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Да, это я понял , что за место $FF, 00 это не проблема .
Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно исправить две строки. Подсказка, вот эти:
Код:
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF + $FF * read_count;
data_s := StringOfChar('F', 2 * read_count);
Да, это я понял , что за место $FF, 00 это не проблема .

Код:
 sum := count + addr and $00 + (addr shr 8) and $00 + (addr shr 16) and $00 + (addr shr 24) and $00 + $00 * read_count;
data_s := StringOfChar('0', 2 * read_count);
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 07:59   #274
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Я код не запускал, но должно было записать каждый диапазон 2 раза: сначала диапазон со старыми адресами полностью из FF, затем диапазон с новыми адресами с данными из старого диапазона.
В том то и дело, что промежутки 00 заполняет, все , а не на конкретном адресе, одном.
Этот код я разобрал. он все пустоты заполняет 00. а не один конкретный самый верхней. самый первый.
Как батан сделал, ума не приложу. я так и сяк уже не в какую.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 08:15   #275
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
за место $FF, 00 это не проблема
В sum не все FF надо заменять на 00.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
он все пустоты заполняет 00. а не один конкретный самый верхней. самый первый.
Тогда я не понял, что именно нужно заполнить. Из всех диапазонов только первый?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.02.2022, 09:56   #276
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда я не понял, что именно нужно заполнить. Из всех диапазонов только первый?
да самый первый !

этот
($0000, $030, $00000),
Считать и на это место 00

Последний раз редактировалось sergey.serg-72; 13.02.2022 в 10:03.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 10:22   #277
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
да самый первый !
Нужно вынести этот новый код из цикла "for j := Low(ranges3) to High(ranges3) do" и подставить в код вместо j ноль. Тогда только для первого диапазона будет запись нулей.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.02.2022, 10:23   #278
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
TMemoryStream загружает данные из файла в память. Поэтому можно её напрямую редактировать. А с TFileStream придется "бегать" по самому файлу и писать данные в файл (меняя Position и делая Write). Но у вас-то не такая ситуация, бинарный файл открывается только на чтение, и из него берутся какие-то данные для записи в текстовый файл.
И ещё один момент, я закрепляю полученные знания и отрабатываю старые уроки за одно.
Решил усовершенствовать код start_pos , end_pos . Считывание вырезанного куска из файла, в заданом диапазоне.

Код:
  var
  Stream: TMemoryStream;
  p: ^Byte;
  i, start_pos, end_pos: integer;

begin
if (sender <> Button1 ) and (EDit1.Text = '')  then
begin
MessageBox(handle,PChar('начальный адрес ввести'+#13#10), PChar('сообщение'), 64);
exit;
end;
if (sender <> Button1 ) and (EDit2.Text = '')  then
begin
MessageBox(handle,PChar('конечный адрес ввести'+#13#10), PChar('сообщение'), 64);
exit;
end;
dlgOpen.Filter := 'Bin File (*.Bin)|*.Bin';
if not dlgOpen.Execute then
exit;
Stream := TMemoryStream.Create;
Stream.LoadFromFile(dlgOpen.FileName);
if Stream.Size < 0 then
begin
MessageBox(handle,PChar('не тот размер файла '), PChar('сообщение'), 64);
Stream.Free;
exit;
end;
start_pos :=Strtoint('$' + edit1.Text) ;
end_pos := Strtoint('$' + edit2.Text) ;
Label1.Caption := IntToStr(Stream.Size) + ' ' + ' '+'Bytes';
begin
Stream.Size := end_pos +1 ;
p := Stream.Memory;
for i := 0 to start_pos-1 do
begin
p^ := $FF;
inc(p);
end;
dlgsave.Filter := 'Bin File (*.Bin)|*.Bin';
dlgsave.FileName := dlgopen.FileName;
if not dlgSave.Execute then
begin
Stream.Free;
exit;
end;
Stream.SaveToFile(dlgSave.FileName + '_file copy_.bin');
Label4.Caption := IntToStr(Stream.Size) + ' ' + 'Bytes';
MessageBox(handle,PChar('файл сделан !'+#13#10), PChar('сообщение'), 64);
Stream.Free;
end;
end;
Всё вырезает, но возникли трудности :
1) не срабатывает код при пустых edit, не пойму почему ?
Код:
begin
if (sender <> Button1 ) and (EDit1.Text = '')  then
begin
MessageBox(handle,PChar('начальный вдрес ввести'+#13#10), PChar('сообщение'), 64);
exit;
end;
if (sender <> Button1 ) and (EDit2.Text = '')  then
begin
MessageBox(handle,PChar('конечный адрес ввести'+#13#10), PChar('сообщение'), 64);
exit;
end;
dlgOpen.Filter := 'Bin File (*.Bin)|*.Bin';
if not dlgOpen.Execute then
exit;
2) Кусок вырезается с FF вверху, это понятно, но как усовершенствовать код с помощью скажем комбобкса , поставил галочку и считанный кусок данных, записался с 0 адреса , только чистые данные, без FF в верху. Снял галочку с FF в верху ? Чтоб и так и так было?
3) Я в редакторе когда, по адресам передвигаюсь, то адрес не в ручную ввожу, а из блокнота , чтоб быстрей и не в ручную каждый раз вводить. В редакторе тоже edit . Скопировал из блокнота адрес, вставил в edit и передвигайся.
Если в программе так делаю, то ошибка вылетает и требуется вводить в ручную, не пойму почему, но ошибка постоянно вылетает, пока в ручную не введу адрес.
Может в настройках edit что то выставлять надо, чтоб скопированный адрес принимала? , а то в ручную постоянно вбивать, не удобно при тестах. Я что то такого раньше не замечал, копировал и вставлял, а тут прям беда.... Может все проблемы из за Stream: TMemoryStream;?

Последний раз редактировалось sergey.serg-72; 13.02.2022 в 10:27.
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 10:24   #279
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно вынести этот новый код из цикла "for j := Low(ranges3) to High(ranges3) do" и подставить в код вместо j ноль. Тогда только для первого диапазона будет запись нулей.
То есть за место j в цикле поставить 0 ?
sergey.serg-72 вне форума Ответить с цитированием
Старый 13.02.2022, 11:05   #280
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 432
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда я не понял, что именно нужно заполнить. Из всех диапазонов только первый?
Нет не записывает он данные, одни 00, а данных нет, всё вроде правильно сделал, но явно ошибка где то, он и данные не записывает и 00 по всему файлу что то я наверное не то делаю ...

Код:
 for j := Low(ranges3) to High(ranges3) do
begin
addr := ranges3[j, 0];
 while addr < ranges3[j, 1] do
begin
read_count := Min(BYTES_IN_LINE, ranges3[j, 1] - addr);
count := read_count + ext_bytes;
sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF + $00 * read_count;
sum := $FF - sum;
data_s := StringOfChar('0', 2 * read_count);
s := Format(data_line, [count, addr, data_s, sum]);
ftxt.Write(s[1], Length(s));
Inc(addr, read_count);
end;
fbin.Position := ranges3[j, 0];
offset := ranges3[j, 2] - ranges3[0, 0];
while fbin.Position < ranges3[j, 1] do
begin
addr := fbin.Position;
read_count := fbin.Read(b[0], min(BYTES_IN_LINE, ranges3[j, 1] - addr));
Inc(addr, offset);
end;
end;
ftxt.Write(termination_line[1], Length(termination_line));
MessageBox(handle,PChar('файл записан !!'+#13#10), PChar('сообщение'), 64);
fbin.Free;
ftxt.Free;
exit;
end;
end;
end;
sergey.serg-72 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 16:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 18:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 16:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 12:51