Помощь - Поиск - Пользователи - Календарь
Полная версия: Нетепизированные файлы (буфер)
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Skrip
Код
Uses Crt;
Var
FromF, ToF : File;
NumRead, NumWritten : Word;
Buf : array [1..64512] of char;
i: integer;
Begin
clrscr;
Assign(FromF, 'c:\new.exe');
Reset(FromF, 1);
Assign(ToF, 'c:\copy_new.exe');
ReWrite(ToF, 1);
WriteLn('Копирую: ', FileSize(FromF), ' байт...');
Repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
Until (NumRead = 0);
Close(FromF);
Close(ToF);
readln
end.

end.

Почему размер буфера записи и чтения устанавливается по 1 байту
(я очень сильно догадываюсь, но хочу узнать правильно или нет)
FreeMan
А ты на разных файлах проверял? В смысле были файлы "жирнее" буфера?
GoodWind
Цитата
Reset(FromF, 1);

1 тут - размер читаемого блока..
Skrip
FreeMan, да. А че не так?
Skrip
GoodWind
Цитата
1 тут - размер читаемого блока..

Т.е. при первом выполнении BlockRead в буфер поместятся 64512 байт начиная с 1 байта;(хотя наверно не так)
SKVOZNJAK
Гы. Reset(FromF, 1); Строка совершенно правильная. 1 обозначает, что третий параметр в процедурах чтения и записи будет умножаться на 1 а не на 128 как по умолчанию. У меня была похожая прога (где-то есть на форуме), только там всё через GOTO написано smile.gif Цикл чтения-записи сильно мудрёно написан, и неправильно, к томуже. Так получше будет
Код
BlockRead(FromF, Buf, NumRead);
BlockWrite(ToF, Buf, NumRead,);

Никогда не пользовался четвёртым параметром. ИМХО счётчик вообще не нужен, выбрось четвёртую переменную smile.gif Тогда процесс выглядит так: третий параметр в процедурах чтения и записи ставим NumRead, по умолчанию он равен размеру буфера(выставляется перед циклом). Перед чтением производится сравнение длины файла (qqq: longint) и NumRead. Если qqq больше, то от него отнимаем NumRead, в противном случае NumRead:=qqq; qqq:=0 ......... Until (qqq = 0); Только, Ихмо, с гото получается прикольнее lol.gif
Skrip
Цитата
1 обозначает, что третий параметр в процедурах чтения и записи будет умножаться на 1 а не на 128 как по умолчанию

А зачем "третий параметр" умножать на 1 (или на 128, к примеру)?
И почему если в Reset(FromF, 1) 1 изменить, допустим, на 128 то размер файла FromF (FileSize(FromF))уменьшается? huh.gif Файл то тум вообще причем?
Ozzя
Цитата
Нетипизированные файлы


Нетипизированные файлы объявляются как файловые переменные типа FILE и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой -позволяет организовать высокоскоростной обмен данными между диском и памятью.

При инициации нетипизированного файла процедурами RESET или REWRITE можно указать длину записи нетипизированного файла в байтах. Например, так:

var

f: file;

begin

.......

assign(f, 'myfile.dat') 

reset(f,512);

.......

end.

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам RESET или REWRITE, в качестве которого может использоваться выражение типа WORD. Если длина записи не указана, она принимается равной 128 байтам.

Турбо Паскаль не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 65535 байтами (емкость целого типа WORD). Однако для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт). Более того, фактически пространство на диске выделяется любому файлу порциями - кластерами, которые в зависимости от типа диска могут занимать 2 и более смежных секторов. Как правило, кластер может быть прочитан или записан за один оборот диска, поэтому наивысшую скорость обмена данными можно получить, если указать длину записи, равную длине кластера.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением READ и WRITE, которые заменяются соответственно высокоскоростными процедурами BLOCKREAD и 3LOCKWRITE . Для вызова этих процедур используются следующие предложения:

BLOCKREAD (<ф .п . >, <буф>, < [, <NN>] ) 

BLOCKWRITE (<ф . п . >, <буф>, < [, <NN>] )

Здесь <буф> - буфер: имя переменной, которая будет участвовать в обмене данными с дисками; 

<D> - количество записей, которые должны быть прочитаны или записаны

за одно обращение к диску; 

<NN> - необязательный параметр, содержащий при выходе из процедуры

количество фактически обработанных записей.

За одно обращение к процедурам может быть передано до N*RECS байт, где RECS - длина записи нетипизированного файла. Передача идет, начиная с первого байта переменной <буф>. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной <буф> была достаточной для размещения всех N*RECS байт при чтении информации с диска. Если при чтении указана переменная <буф> недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать, указав необязательный параметр <NN> (переменная типа WORD).

После завершения процедуры указатель смещается на <NN> записей. Процедурами SEEK, FILEPOS и FILESIZE можно обеспечить доступ к любой записи нетипизированного файла.

SKVOZNJAK
Цитата(Skrip @ 17.12.04 12:25)
А зачем "третий параметр" умножать на 1 (или на 128, к примеру)?
И почему если в Reset(FromF, 1) 1 изменить, допустим, на 128 то размер файла FromF (FileSize(FromF))уменьшается? huh.gif  Файл то тум вообще причем?

На 1 чтобы удобнее smile.gif А 128 - для скорости. Размер сектора кратен 128, минимальный размер записи на диск равен 1 сектору. Колмичество обращений к диску уменьшается. При отсутствии дискового кэша это должно увеличить скорость - дисковые операции самые тормозные, после интернета, конечно lol.gif

Размер файла измеряется в количестве записей smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.