IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Нетепизированные файлы (буфер)
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Код
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 байту
(я очень сильно догадываюсь, но хочу узнать правильно или нет)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


-
****

Группа: Пользователи
Сообщений: 480
Пол: Мужской

Репутация: -  4  +


А ты на разных файлах проверял? В смысле были файлы "жирнее" буфера?


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Автооответчик
*****

Группа: Пользователи
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

Репутация: -  16  +


Цитата
Reset(FromF, 1);

1 тут - размер читаемого блока..


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


FreeMan, да. А че не так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


GoodWind
Цитата
1 тут - размер читаемого блока..

Т.е. при первом выполнении BlockRead в буфер поместятся 64512 байт начиная с 1 байта;(хотя наверно не так)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Гы. 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

Сообщение отредактировано: SKVOZNJAK -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Цитата
1 обозначает, что третий параметр в процедурах чтения и записи будет умножаться на 1 а не на 128 как по умолчанию

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

Сообщение отредактировано: Skrip -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Цитата
Нетипизированные файлы


Нетипизированные файлы объявляются как файловые переменные типа 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 можно обеспечить доступ к любой записи нетипизированного файла.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Цитата(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

Сообщение отредактировано: SKVOZNJAK -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.12.2024 20:41
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name