Искусство программирования на Си (984073), страница 64
Текст из файла (страница 64)
тем больна работу со станлартным вводом/выводом. Хорошо, обрашасмся к функции рнии() или гйгсру(). Можно за- ше вероятность того, что ик можно будет повторно исХарактеристики хороших если требуется манипулировать двоичными файлами, но даться целью собрать козшскцию полсзных операций зз поль.|овать для других целей.
С лругой стороны, лля с текстовыми файлами мозкет возникнуть много специ- врсмя всей своей карьеры. К сожалению, мы нс всегда этого придется нотратгтть больше времени. а это может фнчных для конкретного проекта проблем. Использо- утруждасм себя упорядочением этих опсрапий для оказаться для вас проблемой Но ссг1и у вас есть время Свои инструменты следует писать не быстро, а правиль- ванне стандартного ввола/вывода позволит получить облегчения их повторного использования. Очень часто, репппь простую проблему, то расширьтс ее, а затем когда встречаются знакомь1е проблемы.
мы думаем цро напишите программу для решения этой обобшеннои ныс ресурсы программирования. Но игра стоит свеч — тров для обьединения инструментов в новые созидатель- себя: ' (о пю, я делал что-то подобное нескольло меся- проблемы. Вы поймете, что это один из наиболее инхорошис инструменты можно использовать снова и сно- ныс формь1. терссныл и полсзныл аспектов создания 1пштруметпов. цсв на таз".
Затем идем и ишсм ислодный кол старой ва Давайте поговорим о том, как созлавать хорошие ЗдСТд р тд прог)таммные средства. Простота лясм ее в новую программу и просто жлсм, пока эти Несколько пет назад, когда я работал в стразовой ком- программы выполняют то, что требуется. Интерфейс пояьэователя Дост иезтой ' Я еко Рой 4еРссостл талон- Нотах едолжнобыть.йюбаяр,алнзт ияС по.,— темои расценок, мнЕ порунипн проверить, отвечают ли флплтс с достижением 1ибкосги.
Здесь нтжсн компро- ляет создавать библиотеки полезныл подпрограмм и итаке- вилы современным требованиям. Звучит это да- мисе. более простая программа, скорсс вссго, булет связывать эти библиотеки с приложениями. Тсхнттлогия Д ил илни телннме тена тиз ее лис раздели йггздюггие нрюгрюмннмл инструменталннмн средств Часть й! Глава 20 доступ только тем подпрограммам, которые действи- блемой преобразования табуляция-пробел, то, наверное, Листинг 2020 Разделение выходных данных бы этого хотелось.
Например, нс будет ничего необычтельно и<нонну>Ютея ДанНОй ПрОГрамМОй. Такой подход найдетс занимательным написать собственную програм- программы на два потока. ного, если исхолныс файлы мэйнфрейчовских продает два реальных связанных между собой преимуше- мку, которая делает такого рола преобразование. Фьнс1нде <вед)о.ь> 4' 1 д < Гд' Ь> Грамм хранятся в библиотечном наборе данных (БНД) ства. Во-первых, окончательная программа оказываст- с длиной записи 80 битов (вот почему мэйнфреймовсся меньше, чем если бы в нес всгроили всю библиотс- ПРЕОбРаЗОВаНИЕ ИЗ ЕВСО(С В А5С(! ин)д С (в! да 'Ер) ких программистов иногда обвиняют в "80-колончатом ку Во-вторых, это значит, что выполнение прогРаммы БВСО(С д их о и п 'зу Ь( сЬаг Ьнггег(2048); мышлении").
В результате мэйнфрсймовский документ стандартов кодирования С-проектов часто настоятельсайтах. ольшинство эмуляторов терминала имеют ути- нь11е(гдеьв(ьнЕЕег, взяенЕ Ьнггег, вед(н)) лнту конверти ования, которая производит не ходи- но требует. чтобы строки были нс длиннее, чем 80 козл РазгРУзкам памЯти (свопированию) менеджером пачЯ- б азов; ния м . у АБСН и ЕВС!))С когд! Ерг(нег(вьдонс, "ьа , ЬнЕЕег); лонок, илн даже в некоторых случаях 72 колонки. Это ти операционной системы. Это процесс, который нног- бхо имо пс лапать ай м д мэйн и ской ЗЕ(тШЬЬ )м Ер) позволяет просматривать весь исходный код в редактода значительно увеличивает время выполнения.
Мы ( ре )8РР, который для вашего комфорта и удобства отоможем помочь компоновщик), размещая насколько это группо представить случай, когда вам захочется сделать д.тавз ть луча" к . ть ' ' ' бражаст восьмпразрядныс номера строк. Это хорошо, возможно по нескольку функций в каждом исходном это самому. Например, если создается Универсальный ч Нап име .з с .да з- ) сечи кол пишется на той же самой пзатформе поточу файле. Илеально, когда в исхолноч файле содержится ) что редактор не позволяет забывать о таком ограничетолько одна фУнкциа. Это сьвзан с тем, то очень тРУл-,, б - аГ нии. Однако, сели код уже существует на другой платно корректно извлечь код из обьектного файла на фун 1вг на)н(1не агдс, еЬаг вагди(!) форме и требуется его псренестн, то шансы на успех юшую конверсионную программу можно также найти кш!он'"ьном УРовне (Ра"чо'Рзлтс на!зРилзсР случай к л )ин Боба Стоу а Нч В Ь-сайт -д Сочт РЕЬВ *Ер " ХВЬЬ; ) величнваются, когда существуют строки кода, которые когда функ!)иа используе переменные с областью дей-, аб, д п б в имеется та лица прео разования (в ЕЕ(агде > 1) превышают доп)стимый предел.
В таких случаях праствия файла), поэтому компоновщик ил!ест склонность, -„... „„„, н ( вильнос решение — это огрслактировать нсхолный код Допопнитепвные пгематгтеосое рагдсгы Со ода ни е про грамм пес ив струева пгог воыг средств Часть (И Глава 20 "11пв ве ЕЬе вр111 ро1пе. и впвг Ье вг Чтобы увидеть, насколько неизящно это решение, В некоторых терминальных программах эмуляции р = вггсЬг(еех, Гопррег(*в)); давайте попробуем осуществить фильтрацию исходно- символы квадратных скобок ( и ) не поддерживаются.
10(ввьЬ 1= р) го файла С (такого, как сама эта программа) с аргумен- Символы ОхВА и ОхВ — это эквиваленты ЕВСР(С ( 1пгуа1 )и (р — Вег); том командной строки, равным )О. Ниже приведен символов А5СП Ох5В (левая кшхтрттная скобка) и Ох5Р ) в)геог Ье1рввд!О]; фрагмент результата вывода. (правая квадратная скобка). Однако на практике эти е1ве значения зачастую (в зависимости от установок вашей ( 1ог(1 = О; 1 < ЗЧ 1++) 1.пе аагп(1 терминатьной эмуляции) не работают, потому что ком- Рг(пге( сап'г соптегг ьех чв1пе ъа.1п", 1пг агчс,( в); сваг **в) поновшик отбрасывает их как недопустимые символы.
реев(ве1рввв(1) ); с аг в ' ' вате(ВХХт УЛЬЬОВВ)) гвч) Для С-программистов это прелставляет опрелеленную ) проблему. Одним из решений, если это можно так на- ++ад звать, является использование вместо скобок триграфов. ) зпе ввгп(гпе агдс, сЬаг *вагди) Гпв = ВХ11 Например: гегпгп 1пеуа)Г т впссе55 ) 1пс веаепв = ВХ1Т 50ССЕ55; сЬвг Муаггвутт (тт) = "Ие11о ыог10" 1 сЬаг *е1 еЬвг Уопгдггвут?(100зт) = (0)1 Если использовать эту программу осторожно, то она сЬаг *евер; пер; Этот метод работает, но код довольно трудно про- будет прекрасно работать.
К сожалению, при непра1пе ГЬ1всваг> (пе ГЬ11 втге Г 1(в; всЬвг; Ь ° читать. вильном вводе (т.е. когда строка не распознается как вгге 1 спгг11пе = О; ауге г Как только встречается триграф, ЕВСР)С загружа- имеющая шестнадцатиричный формат) она что-то нс- 11в; ет пару символов, которые компоновщик трактует как разборчиво пишет в выходной поток и завершает рабо- ех с(кхгт Рлгьвкк); ) чЬ»1е((геаб(вс, 1, 1. [Р)) ( Н (с == (ппвздпеб сЬаг1»п) рога("Еап'С чгНе Со Ше. ) сс1ове([Р)Г ехзС(КХгт РЬ1ЬЛКК); ) Н(КОР == 11)пвЬ(ур)) ( роев("111пав (а»1еб.
); гс1ове(гр); ех»С[ВХ1т РЬ1ЬЛКВ); ) Лапа эниптэыэые тимоти«еепие раздет до эд па ие прээерапи э э ы» и не т рты ем там,мы» ар ил те ! Масть И! Глава 20 нужно и прилежно заменил й)пай() на Гаеей(ГР, ОЕ, Нссколькодовольно полезных >тнлнт уже выполня- гскситов недостаточно. Однако (СПАК В!Т+3)/4 эск- РЕЕК С()К). Это рациональный обходной путь, но он ют это.
К сожаленшо, они имеют тендснцизо показы- сигов уже булет достаточно. не понадобится, если использовать цо-настояшему вать шестнадцатиричные результаты вывода в формате зпс Вехнврегвусе = (скьк В1т + э) / 4; А)Ч8)-ориентированный компилятор. из шестнадцати колонок. Хорошо, если ваэци записи ппаздпеб сЬаг *техгвп[(ег; И наконец, даваитс рассмотрим функцию ша!по. имеют ллину, кратную !6 байтам.
Но, как правило, это ппвгдпеб сЬаг *ВехВп[[ег; с = (ппаздпеб сЬаг)опг; Важный момент злесь — эзо поведение программы, когнс так. (весь( 1, -)Ь, ВККХ СВК); Р ° ! да лобавляется несколько аргументов. А)Ч81 не гаранти- Поэтому лавайтс напишем собственную утилиту (ли- взхе С Вуееавеабз сопле++! Н(1 з= тчгНЕ(ае, 1, 1, ГР) ) руст, что агйт(0! содержит название программы. Для стинэ 20.4). По >молчанию установим !шину строки в»хе с тьсавусез конкретной С-реализации будет абсолютно правильным равной 16 байтам, поскольку это даст приемлемо разум- снабдить программу значением агкс, равным 0 В этом ныи вывод на 80-колоночный экран.
Олнако мы обес1прг1ергг = [ореп(Р»1епаае, "гЬ"); сл>чае агхи(0! будет [х(()ЕЕ. Если жс ваша операцион- эзсчим и воз жность изменен я длины стр к чт бы н(мвьь — 1ПР»1ерсг) ная система всегда обеспе эивает значение агкс, равное, колонки могли иметь требуем>ю ширину. Я поза(ютил- ( по крайней морс, 1 и вас нс заботит выпрос персиоси- ся, в частности, о том, чтобы слелать этот код макси- ргхпгт(тдап'С ореп 111е Ъв (ог мости, то для вас зто не является проблемой.
мально переносимым, поэтому его можно запускать геабспд.>п", Рз1епаве); 1пе таси(1пе аиде, спег *види [)) довольно безопасно на любой платформе, лаже на таВСаепа = КХгт РЬ1ЬВКК; ( ких, на которых один байт имеет 32 бита. Создавая ) Н (агдс < 4) инструменты для лэножсства платформ, позаботьтесь об е1ве ( пх переносимости и приложите к этому лсе >силия ( ) рг1пег( Ваадег св Шепаве веагсЬЬуге Вехкпгуксбгв = В[бСЬ * ) Донититсаоаые темаагинесниеразделы < издание нргггриим ни и и не трум снеги мнил средноте Часть и) Глава 20 /е Вставвтв аестваддатврвчвмй ход в Не1р(); завершенное тестирование предполагает до краиности ванисл~ функции ыггой() или некоторым подобным обвестваддатврачамй буфер с соответствуадам Зсасав = Н21Т РА1ЬННЕГ многочисленное повторение прогонов программы. Од- разом). Более то~о, считывать и писать файлы в формате сдввгоМ ег' ) пако если это нужно дслатгч так почему бы нс попы- СКЧ могут большинство программ табличных вычислеврг1всв((сьаг ')(Вехаи[гег + е1ве ТЬ1авуге * ( таться сделать это немного прогце и быстрее' Если мы ний.