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

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

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

 
 Ответить  Открыть новую тему 
> Текстовые файлы. Буфер текстового файла., Несколько вопросов...
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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;


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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

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


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

А нулями заполнен, т.к. Паскаль (в основном) инициализирует переменные нулем...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Oleg_Z

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

var
 f: text;
 x: real;
 z: integer;
...
 begin
   ...
   writeLn(f, 'результаты прогона программы');
   writeLn(f, 'результат №1 = ', x);
   writeLn(f, 'результат №2 = ', z);
 end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

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

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


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

Сообщение отредактировано: Digitalator -


--------------------
In byte we trust
ICQ World.ru
mail[dog]digitalator[dot]com
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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