Чтение и запись данных в бинарный файл.
Модератор: Модераторы
-
karamultuk
- новенький
- Сообщения: 19
- Зарегистрирован: 11.03.2018 15:27:32
Чтение и запись данных в бинарный файл.
Добрый день.
Подскажите пожалуйста, как правильно прочесть нужные мне байты в переменную, а потом записать мои данные в нужное мне место в бинарном файле?
Суть такова.
Есть бинарный файл. Мне нужно прочитать 22 последних байта и после этого записать в конец файла нужную мне информацию (увеличев фай на длину записи).
Пробовал и tfile и tfilestream. Получается ерунда.
Спасибо за ответ.
Подскажите пожалуйста, как правильно прочесть нужные мне байты в переменную, а потом записать мои данные в нужное мне место в бинарном файле?
Суть такова.
Есть бинарный файл. Мне нужно прочитать 22 последних байта и после этого записать в конец файла нужную мне информацию (увеличев фай на длину записи).
Пробовал и tfile и tfilestream. Получается ерунда.
Спасибо за ответ.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
TFileStream норм решение для этого. А почему ерунда? Значит что-то не так сделали
-
karamultuk
- новенький
- Сообщения: 19
- Зарегистрирован: 11.03.2018 15:27:32
Ichthyander писал(а):TFileStream норм решение для этого. А почему ерунда? Значит что-то не так сделали
Так я не спорю. Я непосредственно открываю файл перемещаю указатель filestream.position := filestream.size -22.
Затем использую read(a,22)
Все. На этом ломается.
Если делаю a: string, то не читается.
Если делаю a:char то читается только первый байт.
Если делаю a: array[0..21] of char то читается но в стринг не переводится.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Используйте Readbuffer(a,22);
Вам эти байты в каком виде нужны? В виде байтов или строки или чего еще? Если это структура какая-то можно определить тип packed record с заданным внутри него набором типов, соответствующих Вашим данным
Вам эти байты в каком виде нужны? В виде байтов или строки или чего еще? Если это структура какая-то можно определить тип packed record с заданным внутри него набором типов, соответствующих Вашим данным
-
karamultuk
- новенький
- Сообщения: 19
- Зарегистрирован: 11.03.2018 15:27:32
Ichthyander писал(а):Используйте Readbuffer(a,22);
Вам эти байты в каком виде нужны? В виде байтов или строки или чего еще? Если это структура какая-то можно определить тип packed record с заданным внутри него набором типов, соответствующих Вашим данным
Мне нужно их получить, добавить перед ними нужную строку и обратно записать в файл уже с добавленной строкой
Затем использую read(a,22)
Если делаю a: string, то не читается.
Конечно. Строка - это указатель (4 байта для 32 - битных платформ, 8 байт для 64-битных) на собственно строку.
Ты в 4 байта читаешь 22, и запарываешь память.
Надо:
Код: Выделить всё
SetLength(a, 22); // прежде. чем читать, память надо выделить
read(a[1], 22); //и не в указатель, а в память, на которую он ссылается (в Паскале строки индексируются с 1 а не 0 по историческим причинам)
Или можно заранее определить переменную для короткой строки в 22 байта, которая будет именно строка, а не указатель для неё, как в случае с безразмерной AnsiString.
Код: Выделить всё
Var
stroka: string[22];
...
Begin
...
FileStream.Seek(22, soFromEnd);
FileStream.Read(stroka, 22);
// Чтение автоматически сместит позицию в файле в конец,
// Так что сразу же можно и писать будет
FileStream.Write(stroka, 22);
...
End;-
karamultuk
- новенький
- Сообщения: 19
- Зарегистрирован: 11.03.2018 15:27:32
Vadim писал(а):Или можно заранее определить переменную для короткой строки в 22 байта, которая будет именно строка, а не указатель для неё, как в случае с безразмерной AnsiString.Код: Выделить всё
Var
stroka: string[22];
...
Begin
...
FileStream.Seek(22, soFromEnd);
FileStream.Read(stroka, 22);
// Чтение автоматически сместит позицию в файле в конец,
// Так что сразу же можно и писать будет
FileStream.Write(stroka, 22);
...
End;
Спасибо. Попробую.
Тогда вопрос есть у меня информация которую нужно добавить. Она находится в Стрингер. Как мне ее объединить с этими 22 байтами?
karamultuk писал(а):Она находится в Стрингер.
А это что за экзотическое блюдо?
-
karamultuk
- новенький
- Сообщения: 19
- Зарегистрирован: 11.03.2018 15:27:32
Vadim писал(а):karamultuk писал(а):Она находится в Стрингер.
А это что за экзотическое блюдо?
Типа подписи. Вводят данные о человеке чей файл, а мне нужно добавить в определенное место в конце бинарника. Так как последние 22 байтами это дублирование заголовка бинарника для целостности данных. И вот перед ними мне нужно вставлять данные.
karamultuk
Логическое противоречие между:
и Вашим предыдущим:
Логически противоречивое заявление:
Определённое место в конце бинарника - это конец бинарника и ничего более.
Дружище, у меня создалось впечатление, что Вы просто не понимаете, что нужно делать. Не в плане реализации, а в плане именно смысловом, поскольку Ваши желания, как я показал цитатами, логически противоречивы.
Пока Вы не сможете простыми русскими словами сформулировать Ваше желание - у Вас ничего не получится. Мало того, судя по тому, что никто после Вашего последнего сообщения больше не отозвался - Вас никто не понимает в силу неспособноности объяснить суть проблемы. Постарайтесь сосредоточиться и обычными словами сформулировать, что Вы хотите. Убеждён, что после этого Вы и сами поймёте что делать...
Логическое противоречие между:
karamultuk писал(а):И вот перед ними мне нужно вставлять данные.
и Вашим предыдущим:
karamultuk писал(а):...записать в конец файла нужную мне информацию...
Логически противоречивое заявление:
karamultuk писал(а):...мне нужно добавить в определенное место в конце бинарника.
Определённое место в конце бинарника - это конец бинарника и ничего более.
Дружище, у меня создалось впечатление, что Вы просто не понимаете, что нужно делать. Не в плане реализации, а в плане именно смысловом, поскольку Ваши желания, как я показал цитатами, логически противоречивы.
Пока Вы не сможете простыми русскими словами сформулировать Ваше желание - у Вас ничего не получится. Мало того, судя по тому, что никто после Вашего последнего сообщения больше не отозвался - Вас никто не понимает в силу неспособноности объяснить суть проблемы. Постарайтесь сосредоточиться и обычными словами сформулировать, что Вы хотите. Убеждён, что после этого Вы и сами поймёте что делать...
