Стандартний введення і виведення: vis

Багато програм читають тільки з одного входу і пишуть на один вихід для таких програм цілком достатньо пристроїв стандартного введення-виведення, і цього майже завжди вистачає для початку

Розглянемо програму vis, яка копіює стандартний ввід на стандартний висновок, при цьому всі недруковані символи виводяться у вигляді \nnn, Де nnn – Восьмеричне значення символу Ця програма незамінна для виявлення дивних або небажаних симво лов, що потрапили в файли Наприклад, кожен символ повернення на одну позицію vis виведе як \ 010 (Це вісімкове значення символу):

$ cat  x

a b c

$ vis &ltx

1 Керниган Б, Рітчі Д «Мова програмування Сі», 3-е видання, Невський Діалект, 2002

abc\010\010\010     

$

Для того щоб сканувати декілька файлів за допомогою цієї руди ментарной версії vis, обєднайте файли командою cat:

$ cat  file1 file2 .. | vis

$ cat  file1 file2 .. | vis | grep  \\

Таким чином, можна не турбуватися про доступ до файлів з програми

До речі, може здатися, що це завдання вирішить і sed, адже команда l

виводить недруковані символи в зрозумілому вигляді:

$ sed  -n  l x

abc777    

$

Ймовірно, висновок sed виглядає навіть зрозуміліше, ніж висновок vis Але справа в тому, що sed призначена тільки для обробки текстових файлів:

$ sed  -n  l /usr/you/bin

$                                       Абсолютно нічого

(Так було на PDP-11 що стосується системи на VAX, там виконання sed переривалося, мабуть із-за того, що вхідні дані інтерпретувалися як занадто довга текстова рядок) Так що sed використовувати не можна, тому направимо свої зусилля на створення нової програми

Найпростішими подпрограммами введення і виведення є getchar і putchar Кожен виклик getchar витягує наступний символ з табору дартного введення, яким може бути файл, конвеєр або термінал (за замовчуванням) – Програма цього не знає Аналогічним чином putchar (c) поміщає символ c у стандартний висновок, за замовчуванням це також термінал

Функція printf (3) здійснює перетворення формату виводу Порядок виклику printf і putchar довільний вихідні дані будуть зявлятися в порядку звернення до підпрограм Є й відповідна функція scanf (3) для перетворення формату вхідних даних вона зчитує введення і розбиває його на рядки, числа і т д, як зазначено Порядок виклику scanf і getchar також довільний

Наведемо першу версію vis:

/ * Vis: зробити видимими дивні символи (версія 1) * /

#include &ltstdioh&gt

#include &ltctypeh&gt

main()

{

int c

while  ((c  =  getchar())  =  EOF) if  (isascii(c)  &amp&amp

(isprint(c) ||  c==\n || c==\t  ||  c==  )) putchar(c)

else

printf(&quot\\%03o&quot,  c) exit(0)

}

Функція getchar повертає наступний байт введення або значення EOF, якщо досягнуто кінець файлу (або помилку) Згадайте, що EOF – це НЕ байт файлу (див розділ 2) Значення EOF гарантовано відрізняється від будь-якого значення, яке може містити окремий байт, тому його можна відрізнити від справжніх даних змінна c оголошена як int, а не char, так що вона зможе утримувати значення EOF Рядок

#include &ltstdioh&gt

має бути присутня на початку кожного вихідного файлу Вона змушує компілятор Сі читати заголовний файл(/ Usr / include / stdioh) стандартних функцій і символів, який містить опис EOF Далі в тексті буде зустрічатися короткий запис імені файлу –

&ltstdioh&gt.

Файл – Це ще один заголовний файл, який описує машінонезавісімие тести, що визначають властивості символів У першій версії vis використані isascii і isprint, – вони визначають, чи належить введений символ набору ASCII (значення менше

0200) і чи є він друкував інші тести перераховані в табл 61 Зверніть увагу на те, що символ нового рядка, знак табуляції і пробіл не є «друкувати» за визначеннями

&ltctypeh&gt.

Таблиця 61 Макроси перевірки символів

Імя Що перевіряє isalpha (c) буква: a-z A-Z isupper (c) верхній регістр: A-Z islower (c) нижній регістр: a-z isdigit (c) цифра: 0-9

isxdigit (c) шестнадцатеричная цифра: 0-9 a-f A-F isalnum (c) буква або цифра

isspace (c) пробіл, табуляція, символ нового рядка, вертикальна табуляція, переклад сторінки, повернення каретки

ispunct (c) НЕ алфавітно-цифровий, що не керуючий і не пробільний символ

Імя

Що перевіряє

isprint(c) iscntrl(c) isascii(c)

друкується символ: будь-який графічний керуючі символи: 0 <= c < 040 | | c == 0177

ASCII-символ: 0 <= c <= 0177

Виклик exit наприкінці vis не обовязковий для коректного виконання програми, але завдяки йому будь-який користувач, що запустив vis, побачить код нормального завершення (зазвичай нуль) по завершенні програми Є й інший спосіб отримати код завершення – вихід з ma-in допомогою return 0 тоді кодом завершення програми є величина, яка повертається main Якщо return або exit не присутні в програмі явно, то код завершення передбачити неможливо

Щоб відкомпілювати програму, написану на Сі, помістіть вихідний текст у файл з імям, що закінчується на C, наприклад visc, скомпілюйте її за допомогою cc – компілятор помістить результат у файл aout (a означає асемблер), тепер запустіть його:

$ cc  visc

$ aout

hello  worldctlg hello  world\007 ctld

$

Можна перейменувати aout, коли він запрацює, а можна вказати параметр-o команди cc:

$ cc-o vis visc Висновок вvis, А не вaout

Вправа 61Було вирішено, що знаки табуляції чіпати не треба (тобто не представляти їх як \ 011 або>, або ж \ t), так як головним завданням програми vis є пошук по-справжньому аномальних символів Можна запропонувати й іншу модель – однозначно ідентифікувати кожен символ введення: знаки табуляції, пробіли в кінці рядка, неграфічні символи і т д Змініть vis так, щоб для таких символів, як табуляція, зворотна коса риска, повернення на одну позицію, розрив сторінки і т д, виводилося їх умовне Сі-пред ставление: \ t, \ \, \ b, \ f і т д, а прогалини в кінці рядків позначалися Чи можна зробити це однозначно Порівняйте те, що вийде, з командою sed,

$ sed  -n  l

~

Вправа 62Змініть vis так, щоб вона згортала довгі рядки до деякої розумної довжини Як це вплине на однозначність, згадану в попередній вправі ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*