Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Текстовые файлы. Буфер текстового файла.

Автор: Altair 13.11.2004 11:20

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 13.11.2004 17:21

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;

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

Совокупность всех четырех функций определяет драйвер текстового устройства.
http://borlpasc.narod.ru/docym/farpract/gl/1_3_2.htm

Автор: Altair 13.11.2004 20:35

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

Автор: volvo 13.11.2004 21:14

Цитата
если задать буфер больше, что измениться от этого?

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

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


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

А нулями заполнен, т.к. Паскаль (в основном) инициализирует переменные нулем...

Автор: Altair 13.11.2004 21:35

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

хех, так это все ясно, но всеведь читаю текстовый файл по строкам! (чаще всего)...
тогда проще вобще просто файл без типа завести ..

Автор: volvo 13.11.2004 21:43

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

Автор: Altair 13.11.2004 21:57

Цитата
Лично я использовал буфер, чтобы не эксплуатировать головки дисковода

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

Автор: volvo 13.11.2004 22:12

Oleg_Z

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

var
 f: text;
 x: real;
 z: integer;
...
 begin
   ...
   writeLn(f, 'результаты прогона программы');
   writeLn(f, 'результат №1 = ', x);
   writeLn(f, 'результат №2 = ', z);
 end.

Автор: Altair 13.11.2004 23:32

Цитата
чтобы новичок разобрался с ним так же, как и с моим

нет, ясно что будет менее наглядно и красиво ... я сейчас говорю не о новичках и не о обучении программированию ... серьезные задачи ...
ИМХО применять текстовые файлы непрактично ...

Автор: Digitalator 14.11.2004 0:49

Смотря для чего - для всевозможных файлов с настроками (aka конфиги) текстовые в самый раз, а вот для хранения каких-то данных надо юзать обычные