Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 25.12.2011, 22:11   #1 (permalink)
Katerina Voy
Member
 
Регистрация: 19.12.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Чем отличаются текстовые файлы от типизированных?

Чем отличаются текстовые файлы от типизированных?
Katerina Voy вне форума   Ответить с цитированием

Старый 25.12.2011, 22:11
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Возможно такое, что проблема уже решена в одной из аналогичных тем

Файлы текстовые на Паскале
Подобрать текстовые данные

Старый 26.12.2011, 01:16   #2 (permalink)
alf_x
Mulder
 
Аватар для alf_x
 
Регистрация: 16.08.2011
Сообщений: 185
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 469
По умолчанию

Типизированные файлы

Теперь разберем типизированные файлы. Типизированный файл - это файл в котором записанны идентичные структуры. Например любой файл можно считать файлом байтов - т.е. можно его читать байт за байтом, можно перейти сразу к любому байту по его номеру, можно сразу узнать сколько байт в файле, можно заменить любой байт на другой не перезаписывая файл. Теперь все это в примерах:

Объявляем файл байтов:

var f:file of byte;
b:Byte;

Ассоциируем файловую переменную с физическим файлом:

AssignFile(f,'c:\myfile.bin');

Теперь мы можем либо перезаписать/создать файл:

Rewrite(f);

Либо открыть существующий для чтения и записи:

Reset(f);

Обратите внимание, что функция Reset хотя и имеет такой же формат как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых.

Теперь функции работы с файлом:

read(f,b); - прочитать 1 байт
write(f,b); - записать 1 байт
seek(f,100); - поставить текущее положение считывания/записи на сотый байт
Size(f); - прочитать количество байт в файле.
Eof(f); - узнать не являетсмя ли байт последним

Все эти функции не работают с файлами большими 2 Gb.

После работы файл надо закрыть:

CloseFile(f);

Приведенные выше механизмы будут работать с любым файлом, так как любой файл можно считать файлом байтов. Теперь где это можно использовать? В принципе везде, но в подавляющем большинстве случаев это будет очень неудобно, ведь скорость считывания при чтении по байтам будет на порядки более низкой чем другими способами. Однако в некоторых случаях этот способ может быть очень полезен. Например в программе вам надо заменить 100й байт файла на другой, или прочитать 100й байт файла, например во всяких читерских программах, при взломе и т.п. Здесь такой доступ будет весьма удобен. Гораздо более интересным представляется дальнейшее развитие технологии типизированных файлов (их еще лет 15 назад называли "Файлы прямого доступа"). Представим себе, что файл состоит не из байт а из более сложных структур. Например мы имеем некоторую информацию в виде:

Type MyRec=Record
Name:string[100];
Age:byte;
Membership:Boolean;
Accounts:array[1..10] of integer;
End;

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

Var MyVar:MyRec;

и файл этого типа:

Var f:File of MyRec;

Теперь мы можем читать и писать сразу целую структуру, абсолютно так же как и если бы это был один байт:

AssignFile(f,'c:\MyFile.rec');
Rewrite(f);
MyVar.Name:='Vitaly';
MyVar.Age:=33;
MyVar.Membership:=True;
MyVar.Accounts[1]:=12345;
MyVar.Accounts[2]:=34985;
Write(f,MyVar);
Closefile(f);

Все остальные функции приведенные в предыдущей статье будут работать так же, только одно отличие - Seek и Size оперируют не с количеством байт, а с количеством записей.
alf_x вне форума   Ответить с цитированием
Старый 26.12.2011, 14:36   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ко всему вышесказанному хочу добавить еще пару слов. То, что написал Alf_x, безусловно, правильно - но это рассмотрение с точки зрения "высокой" теории. Я же попытаюсь прояснить вопрос с точки зрения, так сказать, "потребительской", используя в том числе собственный многолетний опыт программирования. Сам я практически типизированными файлами не пользуюсь, если не считать файлов записей - обхожусь текстовыми. И причиной тому - два преимущества текстовых файлов по отношению к типизированным (всё дальнейшее - применительно к Паскалю/Delphi):
1. Созданный программно текстовый файл можно открыть любым текстовым редактором и посмотреть, что в нём. Если же попытаться сделать это с типизированным файлом, то мы увидим лишь нечитабельные значки-коды.
2. Возможность дозаписи в конец файла - оператор Append(f). Этот оператор существует ТОЛЬКО для текстовых файлов.
Есть, правда, у текстовых файлов и недостатки по отношению к типизированным. Пусть нам надо отправить в файл, а затем считать из файла числовой массив А. Если файл типизированный, то можно просто пользоваться операторами Write(f,A[i]) и Read(f,A[i]) - никаких проблем не возникнет. А вот если файл объявлен текстовым, то все числа будут записаны "сплошняком", без пробелов, и считать массив будет уже невозможно. Потому в этом случае необходимо озаботиться принудительной записью пробелов между числами.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 15:18.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.