25.12.2011, 22:11 | #1 (permalink) |
Member
Регистрация: 19.12.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Чем отличаются текстовые файлы от типизированных?
|
25.12.2011, 22:11 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Возможно такое, что проблема уже решена в одной из аналогичных тем Файлы текстовые на Паскале Подобрать текстовые данные |
26.12.2011, 01:16 | #2 (permalink) |
Mulder
Регистрация: 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 оперируют не с количеством байт, а с количеством записей. |
26.12.2011, 14:36 | #3 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ко всему вышесказанному хочу добавить еще пару слов. То, что написал Alf_x, безусловно, правильно - но это рассмотрение с точки зрения "высокой" теории. Я же попытаюсь прояснить вопрос с точки зрения, так сказать, "потребительской", используя в том числе собственный многолетний опыт программирования. Сам я практически типизированными файлами не пользуюсь, если не считать файлов записей - обхожусь текстовыми. И причиной тому - два преимущества текстовых файлов по отношению к типизированным (всё дальнейшее - применительно к Паскалю/Delphi):
1. Созданный программно текстовый файл можно открыть любым текстовым редактором и посмотреть, что в нём. Если же попытаться сделать это с типизированным файлом, то мы увидим лишь нечитабельные значки-коды. 2. Возможность дозаписи в конец файла - оператор Append(f). Этот оператор существует ТОЛЬКО для текстовых файлов. Есть, правда, у текстовых файлов и недостатки по отношению к типизированным. Пусть нам надо отправить в файл, а затем считать из файла числовой массив А. Если файл типизированный, то можно просто пользоваться операторами Write(f,A[i]) и Read(f,A[i]) - никаких проблем не возникнет. А вот если файл объявлен текстовым, то все числа будут записаны "сплошняком", без пробелов, и считать массив будет уже невозможно. Потому в этом случае необходимо озаботиться принудительной записью пробелов между числами. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|