Как известно, информация, обрабатываемая компьютером, хранится в файлах. Структуры файлов для хранения той или иной информации могут быть очень различны. Как правило, разработчик сам сочиняет необходимую структуру файла, например, doc. Также существуют стандарты, описывающие, каким образом информация должна хранится в файле: jpeg, html и т.д. Не смотря на большое разнообразие форматов, их можно разделить на два класса: двоичные (или бинарные) и текстовые.
В текстовых файлах инфорация хранится в виде текста, который довольно легко прочесть человеку. Как правило, после чтения такого файла программа, преобразует прочитанные данные в какую-нибудь двоичную форму для более удобной обработки. Двоичные файлы содержат информацию непосредственно в том виде, в котором она обрабатывается во время работы программы (возможно, с небольшими изменениями или дополнениями). При попытке просмотра такие файлы выглядят как абракадабра.
Обычно текстовые файлы применяются для хранения текстовой информации (странно, не правда ли): txt, html, ini. Однако можно привести в качестве примера формат xpm, который, являясь текстовым, содержит изображение. Этот файл представляет собой описание массива на языке C, каждый элемент которого содержит цвет соответствующей точки. Поэтому такой файл можно включить в программу на C/C++ с помощью директивы include.
Двоичные файлы применяются для хранения нетекстовой информации (тоже удивительное совпадение): изображений (bmp, jpg), исполняемых файлов (elf, exe) и др. Но можно привести в качестве примера формат doc, который используется для хранения текстовой информации.
В этой статье будут рассмотрены достоинства и недостатки текстовых и двоичных файлов. Надеюсь, она будет полезна читателю, т.к. выбор формата файлов также важен как и выбор структур данных для обработки информации.
Как отмечалось ранее, двоичные файлы хранят информацию почти в том виде, в котором она представляется в памяти компьютера во время работы программы. Поэтому при чтении такого файла практически не выполняется никаких преобразований, что ускоряет собственно процесс чтения. Да и сама функция чтения может быть довольно простой.
Но бинарные форматы имеют еще одно очень важное преимущество, однако не технологическое, а маркетинговое. Преимущество состоит в том, что если формат файла не описан, то понять его самостоятельно довольно трудно. Это преимущество можно использовать в войне за рынок. Предположим, что какая-то фирма (для определенности назовем ее M) выпускает программу (W), использующую двоичный формат файлов (d), спецификации которого не публикуются. Если эта фирма сможет занят лидирующее или монопольное положение на рынке, то конкурентам будет довольно тяжело ее потеснить. Если какая-то другая фирма (S) или организация (O) попытается выйти на рынок с программой (OO) аналогичного назначения, то для пользователей буду не так важны преимущества OO перед W, как умение OO обрабатывать файлы формата d. Т.е. использование закрытого двоичного формата позволяет нам более уверенно контролировать ситуацию на рынке, т.к. конкуренты должны будут разгадать наш хитрый формат. А на них можно будет еще и в суд подать :). Правда пользователи нашей программы должны будут мириться с ее глюками, исправлять которые сможем только мы. Но мы ведь деньги зарабатываем, а не занимаемся благотворительностью :)
Самый большой недостаток двоичных файлов - их непереносимость. Мало того, что на разных платформах одни и те же типы данных (например int в языке C) могут иметь разные размеры (2 или 4 байта, к примеру), так еще и порядок байт в слове может быть различным (big-endian и little-endian). Поэтому двоичный файл, созданный на PC неправильно прочитается на Mac. По этой причине в стандартах двоичных файлов всегда оговаривается порядок байтов. Хорошо еще, что сейчас размер байта на всех платформах уже одинаков.
Еще одна проблема связана с так называемым выравниванием. Дело в том, что на некоторых платформах данные должны располагаться по определенным адресам (например, по четным) или рекомендуется их располагать по определенным адресам для более быстрой обработки. Компиляторы могут автоматически выполнять выравнивание. Поэтому, если Вы записываете в файл двоичный образ записи, имеющей размер 3 байта, компилятор вправе записать в файл 4 байта. Естественно, что для правильной обработки программа- читатель должна использовать тот же тип выравнивания, что и программа-писатель.
Также к недостаткам бинарных следует отнести их негибкость. Порядок следования блоков информации в таких файлах жестко задан, поэтому при изменении формата, пользователи вынуждены покупать (точнее приобретать :) новую версию программы. С другой стороны, можно периодически менять форматы файлов, чтобы пользователи имели повод раскошелиться.
Текст является универсальным средством представления информации. В связи с тем, что сейчас на всех платформах байты имеют размер 8 бит и существует стандарт кодирования символов (хотя для русских и украинских симолов таких стандартов даже штук 8 :), текстовый формат является переносимым. Т.е. текст набранный на одной платформе, практически без труда прочитается на другой. Точнее это справедливо для латинских текстов. Для текстов на других языках могут возникнуть проблемы из-за наличия нескольких стандартов кодирования (кодировок). Однако довольно просто создать программу, переводящую текст из одной кодировки в другую.
Второе преимущество текстового представления информации - независимость от порядка байт в слове, т.к. мы работаем непосредственно с байтами.
Именно из-за этих преимуществ все стандарты или протоколы передачи информации в Internet (http, smtp, pop и т.д.) являются текстовыми.
Используя текстовый формат, довольно легко создать файл, структура которого не будет зависеть от порядка расположения блоков информации. Хотя никто не мешает использовать и жесткую структуру.
Если для каждого формата двоичного файла необходима отдельная программа, которая в состоянии его обработать, то для манипуляций с содержимым любых текстовых файлов можно использовать хорошо известные и проверенные временем (каков слог :) инструменты: grep, sed, awk, не говоря о таких монстрах как Perl.
Одним из недостатков текстовых форматов является меньшая скорость считывания и преобразования во внутренний формат программы текстовых файлов. Однако, как правило, чтение файлов выполняется нечасто, да и скорость современных компьютеров достаточна. Более важным недостатком формата является его прозрачная структура. Поэтому другой программист сможет написать свою программу для обработки таких файлов. Если его программа будет лучше нашей, то неблагодарные пользователи будут использовать именно ее, а не наш продукт.
XML (eXtensible Marckup Language, расширяемый язык разметки) - это язык для описания сложных документов. XML разрабатывался как язык, более универсальный, чем HTML и лишенный его недостатков. Есть мрачная шутка, что этот язык объединяет непонятность двоичных форматов и сложность обработки текстовых. Конечно, на самом деле не все так печально. На основе XML можно разрабатывать специализированные языки. Поэтому этот язык в настоящее время очень популярен. Практически все программы переходят на его использование. Например, Open Office для хранения документов использует именно формат на основе XML. В настоящее время разрабатывается стандартный формат хранения офисных документов также на основе XML.
Файлы на основе XML имеют теже преимущества, что и текстовые файлы. Помимо этого, существует несколько библиотек (например, expat) для разбора (парсинга) таких файлов. Поэтому относительно несложно написать функцию, которая будет считывать такие файлы.
Решение о том, какой формат использовать: текстовый или двоичный, следует принимать индивидуально для каждого отдельного случая.
Если Вы разрабатываете программный продукт лишь для одной платформы, а также более сильно котролировать рынок и держать руку на пульсе (или горле) пользователя, то пожалуй стоит использовать двоичный формат.
Если же переносимость и простота обработки - более важные требования, то следует обратить внимание на текстовый формат и XML.