• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Чем отличаются текстовые файлы от типизированных?

Katerina Voy

Новые
Регистрация
19 Дек 2011
Сообщения
12
Реакции
0
Баллы
0
Чем отличаются текстовые файлы от типизированных?

Чем отличаются текстовые файлы от типизированных?
 
Типизированные файлы

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

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

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