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

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

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

> Нетепизированные файлы (буфер)
Skrip
сообщение 14.12.2004 14:16
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
FreeMan
сообщение 14.12.2004 16:38
Сообщение #2


-
****

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

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


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


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


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

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

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


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

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


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


Новичок
*

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

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


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


Новичок
*

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

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


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

Т.е. при первом выполнении BlockRead в буфер поместятся 64512 байт начиная с 1 байта;(хотя наверно не так)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
SKVOZNJAK
сообщение 16.12.2004 18:27
Сообщение #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 - 16.12.2004 18:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Skrip
сообщение 17.12.2004 15:25
Сообщение #7


Новичок
*

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

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


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

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

Сообщение отредактировано: Skrip - 17.12.2004 15:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ozzя
сообщение 17.12.2004 15:51
Сообщение #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 
 К началу страницы 
+ Ответить 
SKVOZNJAK
сообщение 18.12.2004 16:17
Сообщение #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 - 18.12.2004 16:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 23.07.2025 9:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"