Искусство программирования на Си (984073), страница 18
Текст из файла (страница 18)
Запись и чтение данных контейнера 5(гцс( Солта(пег как двоичнык данных. соита1аег->сарас1Су, котором булут сохраняться величины, состояшис из сопсахиег->со1оиг, многих байтов. В этом примере порядок байтов — "от «саста(иег->роя(11оп, $зпс1ийе <аС41гЬ.Ь> спета(иег->че19ЬС) ° старшего к младшему" (старший байт идет первым). В листинге 5.3 прсдсталлсны функции для записи и чтс- 1ит чгбгеЬгп соптагпег(Р1ЬЕ *Гр, сопят ятгисг Сопгазпег *соптагиег) ния этих данных я лвоичном формате. Затем соотастстяуюшая функция читает строку из „ „ ииа(чиеб сьаг ьиггег[17)7 Перее.наеренный нзын С ПШ— Часть ! В ЭТОЙ ГЛАВЕ Эти выражения превращают любую величину !п! в / е копирчеи иеаичиил со ииаиои и г-иияиоиое Хранение и извлечение данных какой формат величин со знаком использует компиля- чоьв еисаие аг(ива[Опии сиаг *г!е1е[, лае тор.
Величины без знака форматируются подобно числам в представлении "дополнение до двух". Странная комбинация чисел в последней строке предотвращает иая[Оиеи епеа1ие = ча1ие >= О переполнение при операциях с величинами со знаком ча1ие + 655360; (напомним, что )и! гарантирует представление чисел в диапазоне от -32767 до 32767). Возможно, компилятор г[е10[0) = (ича1ие » 8) а Ох!!! Стив Саммит сможет провести существенную оптил!изацию.
2[е1Е[1) = ча1ие Ь Ол[[! Последняя проблема касается элемента тче)йй(, име- ) ° Цели и приложения ющего тип ([оиЫе. Существует большое разнообразие представлений чисел с плавающей запятой. Если необ- — ( О * ° Основные методы ( ходима леаксилеальная переносимость, текстовый фор- ипиеипее ича1ие = ((ииа!Опии)г!е14[0)) ° Общие форматы мат будет наилучшим выбороле. Однако в настоящее 6[е)О(1); ° Усовершенствованные методы время многие системы используют стандартные форматы.
опрелелснные а документе А[ЧК[/[ЕЕЕ-764. Соглас- гегига ича1ие <= 32767 ° Смежные вопросы но [ЕЕЕ, длина Воа! сосзавляет 32 бита, а длина доиЫе— ? (зас)ича1ие 64 бита. Остаюзся две проблемы переносил!Ости, размер Всем известно, что, если при обмене информацией с их. Большинство сетевых протоколов предусматривают Щ~ —— Лерееиив>реячиия>ля С Хрипение и и >я >ее ение дивны» Часть ! Глава б Операции чтения и записи фаилов данных концсп- ми величинами, не вс" из которых являются псчатаемы- ют ряд сушественных преимушеств. Прежде всего, они формат лшжет определяться неявно конкретной протуально схожи л>ежду собой. Файл ланных является ми символамн, и попытки просмотреть или обработать удобны для восприятия, а это уже многого стоит.
Мож- граммой, выполняющейся на конкретном компьютере. одним из представлений некоторых абстрактных дан- двоичный фаил данных с помощью обычных утилит лля но просто п<>смотреть в текстовый файл данных и уви- В этом случае для определения всех деталей формата ных, и эти же данные могут бып, прелставлены в па- тскстовыл фтилов приводят к полной бесел>ыслице. деть его содержимое; при этом нет налобносы> в спе- придется совершить определенное количество обратныл мяти с использованием структуры данных.
Проис«с за- Наприл>ср, в шестнадцатиричной системс целое число циазьных програмл>ах просмотра и редактирования, как действий, а это может потребовать написания незавиписи файла данных является просто преобразованием 1К50 предстагшено как Ох073а, следовательно, представ- в случае с двоичными файлами. Вы можете манипули- симой програл>мы, которая люгла бы читать и записыпредставления данных в памяти во внешнее предсгав- ление этого числа в двоичном файле ланных булст со- рован, текстовыми файлами данных, используя обшие, вать файлы, совместимые с файлами исходной програмление при выводе данных в файл. Чтение файла данных держать байты с величинами Ох07 и ОХЗа. На рис. 6.1 не требуюшие доработок программные средства. Тек- л>ы, особенно если новая программа лолжна включает в себя обратный проне~с — чтение и интер- показаны побайтовые представления целой величины стовые файлы также более удобны при отладке: если с выполняться на другом компьютере.
претацию бай~ов внешнего представления и реконструк- 1850 в тскстовол> и лвоичном форл>агах. файлом данных что-то не так, можно просто заглянуть Очень удобно, если кроме собственно данных, форцию представления в памяти. Далее мы увидим, что гг а э о в него и нел>едленно ~очно определить проблему илн в л>ат файла даннь>х содержит информацию, касающую- возможности библиотеки С <ат>)!о.й> вообше адскват- крайнсм случае найти, тле ошибается считываюшая илн ся самого файла данных. Например, многие файлы дан.
ны вссл> аспсктал> обеих рассматриваемых задач, но, как запись>ваюшая программа. Другое преимушество заклю- ных начинаются магическим числам, битовый набор это часто случается, сложности начинаются на уровне а а 1 охза ! охот ! чается в том, что числовые представления, которые л>ы которого идентифицирует определенный сорт файла летки>сиц + --ч----.л склонны использовать в текстовых файлах данных (т.е.
ланных и может быть использован считывающей продругои ст роны, очень важно сознавать, что внут- рИСуНОК б ! Ггредетаваеяияцелаивеаичипы 7850кахеп>раки представления, используемые для записи целых вслн- граммой для проверки того, что на входе находится ренине (в памяти) и внешние представления данных. в телеп>ивам дай-фай>е даипых и каи дв>хбайтавай цеюй чин или величин с плававшей запятой), автоматичес- файл нужного типа. Особенно полезно, если файлы как правило, отличаются. Процесс чтения и записи лан- величины, иепаллоюшей порядок "атм>адшега л старшему", ки становятся нечувствительными к конкретным осо- данных содержат иаиер версии формата.
Таким образом, ных обычно содержит некоторые преобразования, и в в дваичпам файле даппых. бенностям представлений и размеров этих типов на если форл>ат файла изменялся, программа может точно Г)ерееыотренныи нзак С кранение ииеаееиелиее)аннин Масть! Глава 6 в любом месте и в любой момент. За это, конечно, при- онной системе, внутри проераммы С новая строка вес- но считывать текст из файла по символу или по строке Для считывания третьей строки можно написать: ходится платить: явно заданный тег. определяющий гла обозначается одним символом 'хв'.
При записи тек- и преобразовывать выбранные числовые данные, исале 12; 1олд 1лс 13; к(олвзе Е2 е фрагмент данных, занимает дополнительное место в стового файла конец строки обозначается написанием пользУЯ такие фУнкции, как а(ой а(о), а(о(, в!г(о(, зпчое( василе(ьгр, -ькг 91е( 91г, 012, ахз, ае2] е файле. символа 'уп', и, увидев 'хп' при чтении файла, мы зна- и, может быть, яясапГ. (Функция ясапГ имеет заслужен- Текстовые файлы данных часто используют пере- см, что достигли конца строки.
Стандартная библиоте- но плохую репутацию с точки зрения пригодности ес Можно также п очссть это с ок с помощью менные форматы, а двоичные файлы данных обычно ка С преобразует 'хп' в представление конца с~роки, лля устойчивой работы при интерактивном вводе лан- ц й пРеобРазовать три числа, используя звсапй кции Г е(з и п еоб азовать и числа, использ я звсапй используют фиксированныс форматы, но вполне воз- принятое в данной операционной системс, и можно ных пользователем, но функции !агап! и аасапГ могут ядава(зьли, иахьхив, хгр) е можно существование текстового файла фиксированно- обычно полагать, что программа переноса файлов забо- прекрасно подойти для чтения файлов данных при ус- насалг(11л*, Гаа В1е( 91Е", а12, 013, аг2) е го формата и двоичного файла переменного формата. тится о преобразовании представления конца строки, а ловии, что возвращаемые ими значениЯ бУдУт пРове- Либо п читав ст о п еоб о ат числа по оли, прочитав строку, прео разовать числа по олтаюке других деталей формата текстового файла при ряться).
Основные методы переносе файлов данных с одного компьютера на другой. Поэтому обычно при работе с текстовыми файла- Числовыеданные синг ире г2 = асгео1(1(ае ьр 10) В этом разделе приведены базовые. низкого уровня ме- ми можно просто нс обращать внимания на этот тип Расслютрим, наприлеер, файл данных фиксированного гз = ясгсо1(р, ар, 10); толы хранения отдельных объектов в файлах ланных.
особенностей различных платформ. форлеата, содержащий в первой строке целое число, во е2 = нггеоп(Р, ИЦЩ,) е В дальнейшем мы будем использовать их в качестве Различные используемые наборы символов являют- второй строке — число с плавающей точкой и в третьей "строительных блоков" при написании больших частей ся еше олной зависящей от конкретной платформы про- строке — целое число, целое число типа (опй!п( и чисПоскольку функции а(г(о! и з(г(ой могут возвращать программы для чтения и записи целых файлов данных. блемой общих текстовых файлов. Файлы данных, кото- ло с плавающей точкой, подобные привеленным ниже во втором аргументе указатель на символ, сделающий Поскольку методы чтения и записи текстовых и лвоич- рыс нс содержат множества строк, пригодных для за последним и соб азованным символом, можно неных файлов существенно различаются, они рассматри- чтения пользователем, не вызывают особого бсспокой- 123 п твс осрсдс нно соединить вместе последовательность 456.789 Глава 6 11(васап((всг, "ьа-ьд-ьдтьдеьдеьд", ьу, ьво, ьд, ьь, ьв, ьа) < 5 ьь авсапу(ягг, 046$2дазд9026026$2д ьу, ьво, ьд, ьЬ, ьв, ьа) < 5) геепгп (Слав С)(-1)1 геСпгп вКС1ве(ьСв) ) Переееютренный иеык С Хранение и изаеечение данник 1 Часть! мер, необходимо сочетать %о) с типом !п1 и %)д — с ти- В следующей таблице представлены некоторые форпом )овй !п1 для функций рг(01! и ьсапб Подобно этому маты, употребляемые с функциями рг(вт( и ьсапй а так- аСгпсе Св Св (О); %! соответствует типу йоа(, а %(à — типу е)опЫе при ис- же другие функции преобразования, соответствующие пользовании функции ьсавб основным типам данных: Тин данных формат рг(пгр Формат ыапт Яругие функции свае %с %с Св.ев уеаг = у — 1900; Св.Са воп = во — 1; Св.Св вдау = ГМ Ыюн ~п( ее<) %по а(ги, в1По( Св.еа Ьопг = Ь; Св.гв вуп вь Св.гв вес вь 3П1 %п %п а(ой ь(но) (опр ~п1 о ад %х) а101, в1По( Ноа( %е, %1, %0 оЫ а1о1, ввтоп доиЬМ %0 оы оьй чай а101, ащод в1пля %в Эта функция достаточно устойчива: кроме формата, строку, в начале каждой строки находится идентифигенерируемого Вще(рг!п1, может быть считано сжатое катер, соответствующий имени элемента структуры.
представление с игнорированием излишней пунктуа- Например, весь файл данных может выглядеть следую- Если в файле данных нужно сохранить переменную операционная система или стандартная библиотека С ции, также допустимое в стандарте )80 860!. В другом щим образом: без знака, можно использовать форматы %в или %)в которых используют различные определения типе 1, случае можно пропустить секунды и полагать их равлибо функцию ь(гтов). Можно так:кс использовать аль- метки времени в файле данных нс будут иметь смысла.