Чтение и запись данных в бинарный файл.

Вопросы программирования и использования среды Lazarus.

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

Чтение и запись данных в бинарный файл.

Сообщение karamultuk » 18.07.2018 13:23:09

Добрый день.
Подскажите пожалуйста, как правильно прочесть нужные мне байты в переменную, а потом записать мои данные в нужное мне место в бинарном файле?
Суть такова.
Есть бинарный файл. Мне нужно прочитать 22 последних байта и после этого записать в конец файла нужную мне информацию (увеличев фай на длину записи).
Пробовал и tfile и tfilestream. Получается ерунда.
Спасибо за ответ.
karamultuk
новенький
 
Сообщения: 19
Зарегистрирован: 11.03.2018 16:27:32

Re: Чтение и запись данных в бинарный файл.

Сообщение Ichthyander » 18.07.2018 19:23:28

TFileStream норм решение для этого. А почему ерунда? Значит что-то не так сделали
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Чтение и запись данных в бинарный файл.

Сообщение karamultuk » 18.07.2018 20:24:37

Ichthyander писал(а):TFileStream норм решение для этого. А почему ерунда? Значит что-то не так сделали

Так я не спорю. Я непосредственно открываю файл перемещаю указатель filestream.position := filestream.size -22.
Затем использую read(a,22)
Все. На этом ломается.
Если делаю a: string, то не читается.
Если делаю a:char то читается только первый байт.
Если делаю a: array[0..21] of char то читается но в стринг не переводится.
karamultuk
новенький
 
Сообщения: 19
Зарегистрирован: 11.03.2018 16:27:32

Re: Чтение и запись данных в бинарный файл.

Сообщение Ichthyander » 18.07.2018 20:49:12

Используйте Readbuffer(a,22);
Вам эти байты в каком виде нужны? В виде байтов или строки или чего еще? Если это структура какая-то можно определить тип packed record с заданным внутри него набором типов, соответствующих Вашим данным
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Чтение и запись данных в бинарный файл.

Сообщение karamultuk » 18.07.2018 21:25:22

Ichthyander писал(а):Используйте Readbuffer(a,22);
Вам эти байты в каком виде нужны? В виде байтов или строки или чего еще? Если это структура какая-то можно определить тип packed record с заданным внутри него набором типов, соответствующих Вашим данным

Мне нужно их получить, добавить перед ними нужную строку и обратно записать в файл уже с добавленной строкой
karamultuk
новенький
 
Сообщения: 19
Зарегистрирован: 11.03.2018 16:27:32

Re: Чтение и запись данных в бинарный файл.

Сообщение Cheb » 19.07.2018 01:45:42

Затем использую read(a,22)
Если делаю a: string, то не читается.

Конечно. Строка - это указатель (4 байта для 32 - битных платформ, 8 байт для 64-битных) на собственно строку.
Ты в 4 байта читаешь 22, и запарываешь память.
Надо:
Код: Выделить всё
SetLength(a, 22); // прежде. чем читать, память надо выделить
read(a[1], 22); //и не в указатель, а в память, на которую он ссылается (в Паскале строки индексируются с 1 а не 0 по историческим причинам)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Чтение и запись данных в бинарный файл.

Сообщение Vadim » 19.07.2018 04:25:13

Или можно заранее определить переменную для короткой строки в 22 байта, которая будет именно строка, а не указатель для неё, как в случае с безразмерной AnsiString.
Код: Выделить всё
Var
  stroka: string[22];
  ...
Begin
  ...
  FileStream.Seek(22, soFromEnd);
  FileStream.Read(stroka, 22);
  // Чтение автоматически сместит позицию в файле в конец,
  // Так что сразу же можно и писать будет
  FileStream.Write(stroka, 22);
  ...
End;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Чтение и запись данных в бинарный файл.

Сообщение karamultuk » 19.07.2018 11:10:30

Vadim писал(а):Или можно заранее определить переменную для короткой строки в 22 байта, которая будет именно строка, а не указатель для неё, как в случае с безразмерной AnsiString.
Код: Выделить всё
Var
  stroka: string[22];
  ...
Begin
  ...
  FileStream.Seek(22, soFromEnd);
  FileStream.Read(stroka, 22);
  // Чтение автоматически сместит позицию в файле в конец,
  // Так что сразу же можно и писать будет
  FileStream.Write(stroka, 22);
  ...
End;

Спасибо. Попробую.
Тогда вопрос есть у меня информация которую нужно добавить. Она находится в Стрингер. Как мне ее объединить с этими 22 байтами?
karamultuk
новенький
 
Сообщения: 19
Зарегистрирован: 11.03.2018 16:27:32

Re: Чтение и запись данных в бинарный файл.

Сообщение Vadim » 19.07.2018 11:21:17

karamultuk писал(а):Она находится в Стрингер.

А это что за экзотическое блюдо?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Чтение и запись данных в бинарный файл.

Сообщение karamultuk » 19.07.2018 13:47:45

Vadim писал(а):
karamultuk писал(а):Она находится в Стрингер.

А это что за экзотическое блюдо?

Типа подписи. Вводят данные о человеке чей файл, а мне нужно добавить в определенное место в конце бинарника. Так как последние 22 байтами это дублирование заголовка бинарника для целостности данных. И вот перед ними мне нужно вставлять данные.
karamultuk
новенький
 
Сообщения: 19
Зарегистрирован: 11.03.2018 16:27:32

Re: Чтение и запись данных в бинарный файл.

Сообщение Vadim » 24.07.2018 08:45:59

karamultuk
Логическое противоречие между:
karamultuk писал(а):И вот перед ними мне нужно вставлять данные.

и Вашим предыдущим:
karamultuk писал(а):...записать в конец файла нужную мне информацию...

Логически противоречивое заявление:
karamultuk писал(а):...мне нужно добавить в определенное место в конце бинарника.

Определённое место в конце бинарника - это конец бинарника и ничего более.

Дружище, у меня создалось впечатление, что Вы просто не понимаете, что нужно делать. Не в плане реализации, а в плане именно смысловом, поскольку Ваши желания, как я показал цитатами, логически противоречивы.
Пока Вы не сможете простыми русскими словами сформулировать Ваше желание - у Вас ничего не получится. Мало того, судя по тому, что никто после Вашего последнего сообщения больше не отозвался - Вас никто не понимает в силу неспособноности объяснить суть проблемы. Постарайтесь сосредоточиться и обычными словами сформулировать, что Вы хотите. Убеждён, что после этого Вы и сами поймёте что делать... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru