Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
3 / 3 / 0
Регистрация: 26.11.2015
Сообщений: 170
1

BlockWrite и BlockRead

01.10.2017, 01:28. Показов 2496. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
http://www.delphibasics.ru/BlockWrite.php
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  myFile    : File;
  byteArray : array[1..8] of byte;
  oneByte   : byte;
  i, count  : Integer;
 
begin
  // Попытка открыть файл Test.byt для записи
  AssignFile(myFile, 'Test.byt');
  ReWrite(myFile, 4);   // Определение отдельной 'записи' как 4 байта
 
  // Заполнение массив данными
  for i := 1 to 8 do
    byteArray[i] := i;
 
  // Запись данных массива в файл
  BlockWrite(myFile, byteArray, 2);   // Запись 2 'записи' из 4 байт
byteArray[1] = 00000001
byteArray[2] = 00000010
byteArray[3] = 00000011
byteArray[4] = 00000100
byteArray[5] = 00000101
byteArray[6] = 00000110
byteArray[7] = 00000111
byteArray[8] = 00001000

Запись байтов идет справа налево, а значит:
Первая запись = 00000100000000110000001000000001
Вторая запись = 00001000000001110000011000000101

Delphi
1
2
3
4
5
6
7
8
9
  // Заполнение массива данных с различными данными
  for i := 1 to 4 do
    byteArray[i] := i*i;              // Значение : 1, 4, 9, 16
 
  // Запись только первых 4 элементов из массива данных в файл
  BlockWrite(myFile, byteArray, 1);   // Запись 1 записи из 4 байт
 
  // Закрытие файла
  CloseFile(myFile);
byteArray[1] = 00000001
byteArray[2] = 00000100
byteArray[3] = 00001001
byteArray[4] = 00010000

Запись байтов идет справа налево, а значит:
Третья запись = 00010000000010010000010000000001

Конечная запись: 00010000000010010000010000000001000010000000011100000110000001010000010000000011 0000001000000001

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
  // Повторное открытие файла для чтения
  FileMode := fmOpenRead;
  Reset(myFile, 2);   // Теперь мы определяем одну запись как 1 байт
 
  // Показ содержимого файла
  // Чтение первых 6 байт.'count' установлен в
  // текущий считанный номер
  ShowMessage('Чтение первого набора байтов :');
  BlockRead(myFile, byteArray, 6, count);
 
  // Показ считанных значений байта
  for i := 1 to count do
    ShowMessage(IntToStr(byteArray[i]));
Заменил 1 на 2 в Reset(myFile, 2), чтобы 1 запись была 2 байт. А значит первая запись станет 0000001000000001, в числовом виде 513, вторая 1027, и ничто не сможет влезть в byteArray[i]. На практике работает, читая по 1 байту (а команда стоит читать по 2), и выводит по порядку - 1, 2, 3 т. д. Почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2017, 01:28
Ответы с готовыми решениями:

Альтернатива AssignFile, BlockRead, BlockWrite
Доброго времени суток. Появилась такая проблема. AssignFile не умеет хавать большие файлы, а мне...

С помощью процедур BlockRead и BlockWrite добавить к первому файлу содержимое второго файла
Даны два файла одного и того же типа. С помощью процедур BlockRead и BlockWrite добавить к первому...

BlockWrite BlockRead
Привет Пишу Распаковщик и столкнулся с такой проблеммой Мне к примеру нужна записаль 2586 байт с 48...

Использование blockread / blockwrite
как вообще записывать блоками? хочу записать из stringgrid в нетипизированный файл данные и читать...

6
пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
01.10.2017, 01:52 2
Вопрос не понятен. В чём проблема? Что значит
Цитата Сообщение от Patsukin Посмотреть сообщение
выводит по порядку - 1, 2, 3 т. д.
0
3 / 3 / 0
Регистрация: 26.11.2015
Сообщений: 170
01.10.2017, 02:07  [ТС] 3
Читает побайтово, а не по 2 байта!
Reset(myFile, 2) - одна запись равна 2 байта. А читает как 1!
Значит данные в порядке заполнения массива!
Миниатюры
BlockWrite и BlockRead  
0
пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
01.10.2017, 02:50 4
Цитата Сообщение от Patsukin Посмотреть сообщение
Читает побайтово, а не по 2 байта!
Ничего не понимаю.
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,157
Записей в блоге: 1
01.10.2017, 05:25 5
Цитата Сообщение от Patsukin Посмотреть сообщение
Почему?
Потому, что вот здесь у тебя ошибка:
Цитата Сообщение от Patsukin Посмотреть сообщение
Запись байтов идет справа налево, а значит:
Запись (и чтение) байтов идёт по порядку, независимо от того, какими блоками ты читаешь.
0
3 / 3 / 0
Регистрация: 26.11.2015
Сообщений: 170
01.10.2017, 08:13  [ТС] 6
Слева направо идет? Тогда все равно не понимаю.
byteArray[1] = 00000001
byteArray[2] = 00000010
byteArray[3] = 00000011
byteArray[4] = 00000100
Отдельная запись в 4 байта с этими числами примет вид byteArray[1]+byteArray[2]+byteArray[3]+byteArray[4] = 00000001000000100000001100000100 - так или нет? То бишь запись равна 16909060 в Integer-е?

Reset(myFile, 2) - изменяем длину записи на 2 байт. В документе сохранено 4 байт, а значит 1 запись преобразовывается в 2 записи, 0000000100000010 и 0000001100000100. При выполнении первая запись равна 1, а должна 258!!!!!
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,157
Записей в блоге: 1
01.10.2017, 15:11 7
И не справа налево, и не слева направо, а по порядку.
Вы путаете расположение байтов в памяти, и расположение байтов в числах.
Отдельная запись в 4 байта с этими числами примет вид byteArray[1]+byteArray[2]+byteArray[3]+byteArray[4] = 00000001000000100000001100000100 - так или нет? То бишь запись равна 16909060 в Integer-е?
Не так. То есть, в памяти располагается так (по порядку):
адр адр+1 адр+2 адр+3
00000001 00000010 00000011 00000100
Но если интерпретировать это как целое число, то младший байт - 00000001, то есть число будет
00000100000000110000001000000001
0
01.10.2017, 15:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2017, 15:11
Помогаю со студенческими работами здесь

Чем заменить BlockRead и BlockWrite из TurboPascal?
Здравствуйте. Никак не могу понять, чем заменить BlockRead и BlockWrite. Тут смотрел, ссылки на...

С помощью методов BlockRead и BlockWrite создать копию файла
Задача:Дан файл произвольного типа. С помощью процедур BlockRead и BlockWrite создать его копию с...

Blockread и Blockwrite. Добавить к 1-му файлу содержание второго, а ко второму файлу - содержание первого
даны 2 файла одного и того же типа. с помощью процедурывить Blockread и Blockwrite добавить...

BlockWrite, и её скорость работы
Есть задача: в двух циклах создать и заполнить N нетипизированных файлов каждый M набором байт....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru