Помощь - Поиск - Пользователи - Календарь
Полная версия: Текстовые файлы. Буфер текстового файла.
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Altair
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
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;

Значение, возвращаемое функцией, зависит от успешности выполнения соответствующей операции и равно нулю, если операция прошла успешно.

Совокупность всех четырех функций определяет драйвер текстового устройства.
Источник ...
Altair
Хм.. а вот с буфером странно все-равно, если задать буфер больше, что измениться от этого?
В принципе могли бы реализовать один буфер... blink.gif
так а 4 вопрос? зачем буфер юзера и почему всегда заполнен нулями?
volvo
Цитата
если задать буфер больше, что измениться от этого?

При обращении к физическому файлу на диске максимальное количество данных, которое может быть прочитано за одно обращение = размеру буфера. Т.е., увеличивая размер буфера, мы увеличиваем скорость работы с файлами (рекомендуется размер буфера, кратный размеру кластера)

Цитата
зачем буфер юзера и почему всегда заполнен нулями?


Поле записи TextRec.UserData может использоваться для хранения любой пользовательской информации (например, в функции, реализующей интерфейс с устройством). Это поле не изменяется файловой системой Borland Pascal, следовательно, пользователь не потеряет информацию, которая в нем хранится...

А нулями заполнен, т.к. Паскаль (в основном) инициализирует переменные нулем...
Altair
Цитата
Т.е., увеличивая размер буфера, мы увеличиваем скорость работы с файлами (рекомендуется размер буфера, кратный размеру кластера)

хех, так это все ясно, но всеведь читаю текстовый файл по строкам! (чаще всего)...
тогда проще вобще просто файл без типа завести ..
volvo
Так читая по строкам, ты не читаешь с диска - читаешь из буфера, а как буфер опустел - он подкачивает еще порцию данных. Лично я использовал буфер, чтобы не эксплуатировать головки дисковода (читаешь за 1 раз, например, 16К, а не 128 байт) ;)
Altair
Цитата
Лично я использовал буфер, чтобы не эксплуатировать головки дисковода

Все правильно, но я с таким-же успехом могу прочитать просто файл типа FILE например 16 кб и не мучаться с текстовыми .. вобщем не оправданно это smile.gif)
volvo
Oleg_Z

Напиши мне аналогичный код, используя бестиповые файлы, чтобы новичок разобрался с ним так же, как и с моим, и чтобы можно было прочитать результат работы в файле ... rolleyes.gif

var
 f: text;
 x: real;
 z: integer;
...
 begin
   ...
   writeLn(f, 'результаты прогона программы');
   writeLn(f, 'результат №1 = ', x);
   writeLn(f, 'результат №2 = ', z);
 end.
Altair
Цитата
чтобы новичок разобрался с ним так же, как и с моим

нет, ясно что будет менее наглядно и красиво ... я сейчас говорю не о новичках и не о обучении программированию ... серьезные задачи ...
ИМХО применять текстовые файлы непрактично ...
Digitalator
Смотря для чего - для всевозможных файлов с настроками (aka конфиги) текстовые в самый раз, а вот для хранения каких-то данных надо юзать обычные
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.