![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Altair |
![]()
Сообщение
#1
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
1. Зачем система при работе с текстовыми файлами, использует два одинаковых буфера?
(Я проверил, они всегда одинаковы.) 2. Зачем один буфер она размещает в стеке, а другой в куче? 3. На что указывают 4 адреса в записе файловой переменной? вот такие: OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
На процедуры? Что для каждого файла выходит есть в памяти своя процедура закрытия, и т.п. ? ЗЫ: мне кажется что под текстовыми файлами скрываются обычые, но нас хорошо обманывают, а именно - ИМХО: при открытии файла как текстовго, система на самом деле его читает как обычный, испольуя процедуры blockread, blockwrite (скоростные), и читает все эту гадость, а именно 127 байт в буфер. А при чтении строки из файла, на самом деле читается она не из файла а из буфера (ну а буфер как только мы к концу его подобрались обновляется). ..... хе-хе, ловко, ловко ... :yes: Все было бы в моей теории хорошо, если бы не наличие второго буфера... 4. Что за буфер в памяти есть для файлов (всех) под именем UserData (всегда он почему-то заполне нулями) ЗЫ: Забыл сказать, я имею ввиду, что тип файловойпеременной file таков: (вернее text) TextBuf = array[0..127] of Char;
TextRec = record
Handle: Word;
Mode: Word;
BufSize: Word;
Private: Word;
BufPos: Word;
BufEnd: Word;
BufPtr: ^TextBuf;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..16] of Byte;
Name: array[0..79] of Char;
Buffer: TextBuf;
end;
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Oleg_Z
1. Цитата Зачем один буфер она размещает в стеке, а другой в куче? Ты имеешь в виду эти 2 переменные? TextRec = record
...
BufPtr: ^TextBuf;
...
Buffer: TextBuf;
end;
Так Buffer - это стандартный буффер текстового файла, равный 128 байт, который создается при открытии без указания размера буфера: var f: text;
...
assign(f, name);
rewrite(f);
Если же открыть текстовый файл так: var
f: text;
buffer: array[1 .. 1024] of byte;
...
assifn(f, name);
settextbuf(f, buffer);
rewrite(f);
то файл будет пользоваться буфером, размещенным в переменной buffer, разместив указатель на него в своем поле: f.bufPtr := @buffer; (поэтому, кстати, и существует условие, что эта переменная должна существовать до тех пор, пока файл не будет закрыт) 2. Цитата На что указывают 4 адреса в записе файловой переменной? Эти 4 поля типа Pointer имеют следующий смысл: OpenFunc — адрес функции, получающей управление при открытии текстового файла; CloseFunc — адрес функции, вызываемой при закрытии текстового файла; InOutFunc — адрес функции, активизируемой в момент физического обращения к устройству для записи или чтения информации; FlushFunc — адрес функции, осуществляющей «выталкивание» текстового буфера при буферизованном выводе информации. Каждая из этих четырех функций должна транслироваться в расчете на дальнюю модель памяти и соответствовать следующему заголовку: type
FuncType = Function (var F: TextRec): Integer;
Значение, возвращаемое функцией, зависит от успешности выполнения соответствующей операции и равно нулю, если операция прошла успешно. Совокупность всех четырех функций определяет драйвер текстового устройства. Источник ... Сообщение отредактировано: volvo - 5.04.2010 14:35 |
Altair |
![]()
Сообщение
#3
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Хм.. а вот с буфером странно все-равно, если задать буфер больше, что измениться от этого?
В принципе могли бы реализовать один буфер... ![]() так а 4 вопрос? зачем буфер юзера и почему всегда заполнен нулями? -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата если задать буфер больше, что измениться от этого? При обращении к физическому файлу на диске максимальное количество данных, которое может быть прочитано за одно обращение = размеру буфера. Т.е., увеличивая размер буфера, мы увеличиваем скорость работы с файлами (рекомендуется размер буфера, кратный размеру кластера) Цитата зачем буфер юзера и почему всегда заполнен нулями? Поле записи TextRec.UserData может использоваться для хранения любой пользовательской информации (например, в функции, реализующей интерфейс с устройством). Это поле не изменяется файловой системой Borland Pascal, следовательно, пользователь не потеряет информацию, которая в нем хранится... А нулями заполнен, т.к. Паскаль (в основном) инициализирует переменные нулем... |
Altair |
![]()
Сообщение
#5
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата Т.е., увеличивая размер буфера, мы увеличиваем скорость работы с файлами (рекомендуется размер буфера, кратный размеру кластера) хех, так это все ясно, но всеведь читаю текстовый файл по строкам! (чаще всего)... тогда проще вобще просто файл без типа завести .. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Так читая по строкам, ты не читаешь с диска - читаешь из буфера, а как буфер опустел - он подкачивает еще порцию данных. Лично я использовал буфер, чтобы не эксплуатировать головки дисковода (читаешь за 1 раз, например, 16К, а не 128 байт) ;)
|
Altair |
![]()
Сообщение
#7
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата Лично я использовал буфер, чтобы не эксплуатировать головки дисковода Все правильно, но я с таким-же успехом могу прочитать просто файл типа FILE например 16 кб и не мучаться с текстовыми .. вобщем не оправданно это ![]() -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Oleg_Z
Напиши мне аналогичный код, используя бестиповые файлы, чтобы новичок разобрался с ним так же, как и с моим, и чтобы можно было прочитать результат работы в файле ... ![]() var
f: text;
x: real;
z: integer;
...
begin
...
writeLn(f, 'результаты прогона программы');
writeLn(f, 'результат №1 = ', x);
writeLn(f, 'результат №2 = ', z);
end.
|
Altair |
![]()
Сообщение
#9
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата чтобы новичок разобрался с ним так же, как и с моим нет, ясно что будет менее наглядно и красиво ... я сейчас говорю не о новичках и не о обучении программированию ... серьезные задачи ... ИМХО применять текстовые файлы непрактично ... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Digitalator |
![]()
Сообщение
#10
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 247 Пол: Мужской Репутация: ![]() ![]() ![]() |
Смотря для чего - для всевозможных файлов с настроками (aka конфиги) текстовые в самый раз, а вот для хранения каких-то данных надо юзать обычные
Сообщение отредактировано: Digitalator - 13.11.2004 20:50 -------------------- |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 6:44 |