Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

В табл. 6.2 перечислены некоторые средства работы со строками и ряд полезных функций, одна из которых

strcmp
. Как правило, лучше воспользоваться этими стандартными функциями, чем писать собственные, так как они отлажены и зачастую выполняются быстрее, чем написанные вами, поскольку были оптимизированы для конкретных машин (нередко благодаря использованию Ассемблера).

strcat(s,t)
Добавляет строку
t
к строке
s
; возвращает
s
strncat(s,t,n)
Добавляет не более n символов
t
к
s
strcpy(s,t)
Копирует
t
в
s
; возвращает
s
strncpy(s,t,n)
Копирует точно n символов; при необходимости добавляет
NULL
strcmp(s,t)
Сравнивает
s
и
t
, возвращает <0, 0, >0 при <, ==, >
strncmp(s,t,n)
Сравнивает не более
n
символов
strlen(s)
Возвращает длину
s
strchr(s,c)
Возвращает указатель на первый символ с в
s
и
NULL
, если с отсутствует
strrchr(s,c)
Возвращает указатель на последний
с
в
s
и
NULL
, если
с
отсутствует.
atoi(s)
Возвращает целое значение
s
atof(s)
Возвращает "плавающее" значение
s
; необходимо описание
double atof
malloc(n)
Возвращает указатель на область памяти в
n
байт и
NULL
, если это невозможно
calloc(n,m)
Возвращает указатель на
n*m
обнуленных байтов и
NULL
, если это невозможно;
malloc
и
calloc
возвращают значение типа
char*
free(p)
Освобождает память, выделенную
malloc
и
calloc

Таблица 6.2: Стандартные функции, выполняемые над строками

Упражнение 6.3

Измените аргумент

– s
так, чтобы
vis -sn
печатала только строки из
n
или более печатаемых символов, опуская непечатаемые символы и короткие последовательности обычных, печатаемых символов. Это полезно при выделении ''текстовых'' частей в нетекстовых файлах, таких, как рабочие программы. Некоторые версии системы содержат для подобных целей программу
strings
. Что лучше: иметь отдельную программу или пользоваться специальным аргументом
vis
?

Упражнение 6.4

Доступность исходной программы на Си — одно из достоинств системы UNIX; такая программа демонстрирует элегантные решения многих программистских проблем. Прокомментируйте баланс между наглядностью программы на Си и встречающимися "оптимизированными" фрагментами, переписанными на Ассемблере.

6.3 Доступ к файлам:

vis
версия 3

Две первые версии

vis
читают из стандартного входного потока и пишут в стандартный выходной поток, причем оба потока наследуются от
shell
. Следующий шаг модификация
vis
для работы с файлами по их именам, так что

$ vis файл1 файл2 ...

будет просматривать эти именованные файлы вместо стандартного входного потока. Если же имен файлов в качестве аргументов нет,

vis
должна читать стандартный входной поток.

Возникает вопрос: как организовать чтение файлов, т.е. как связать имена файлов с операторами ввода вывода, реально читающими данные? Правила просты. Прежде чем быть прочитанным или записанным, файл должен быть открыт стандартной библиотечной функцией

fopen
. Последняя берет имя файла (например,
temp
или
/etc/passwd
), взаимодействует с ядром и возвращает обратно "внутреннее имя", которое используется при последующих операциях с данным файлом.

Внутреннее имя является на самом деле указателем (называемым указателем файла) на структуру, содержащую информацию о файле, такую, как расположение буфера, текущую позицию символа в буфере, режим чтения или записи и т.п. Эта структура определяется в файле

<stdio.h>
и имеет имя
FILE
. Описание указателя файла таково:

FILE *fp;

Оно означает, что

fp
— указатель на
FILE
,
fopen
возвращает указатель на
FILE
; в
<stdio.h>
имеется описание типа для
fopen
. Реальный вызов функции
fopen
:

char *name, *mode;

fr = fopen(name, mode);

Первый аргумент

fopen
представляет собой имя файла (строку символов). Второй аргумент также является символьной строкой, показывающей, как вы намереваетесь использовать файл; допустимые режимы: читать (
"r"
), писать (
"w"
) или дописать (
"а"
).

Если файл, который вы открыли для записи или дописывания, не существует, он создается, если это возможно. Открытие для записи существующего файла вызывает уничтожение старого содержимого. Попытка читать несуществующий файл считается ошибкой, так же как и попытка читать или писать файл без разрешения. При возникновении ошибки

fopen
возвращает значение несуществующего указателя
NULL
(которое обычно определяется в
<stdio.h>
как
(char*)0
).

Далее, нужен способ читать или писать файл после того, как он открыт. Есть несколько способов, из которых использование

getc
и
putc
самый простой. Функция
getc
выбирает из файла очередной символ:

с = getc(fp)

помещает в

с
следующий символ из файла, на который указывает
fp
. Эта функция возвращает
EOF
по достижении конца файла. Функция
putc
аналогична
getc
:

putc(c, fp)

помещает символ

с
в файл
fp
и возвращает
с
. Функции
getc
и
putc
возвращают
EOF
в случае ошибки.

Когда программа начинает выполняться, уже открыты три файла и имеются их указатели. Это стандартные потоки: входной, выходной и поток диагностики; соответствующие указатели называются

stdin
,
stdout
и
stderr
. Указатели на файлы описаны в
<stdio.h
> и могут использоваться там, где может быть объект типа
FILE*
. Они являются не переменными, а константами, так что им нельзя присвоить значения. Вызов
getchar
есть
getc(stdin)
, a
putchar(c)
есть
putc(c, stdout)
. На самом деле все эти четыре "функции" определены в
<stdio.h>
как макрокоманды. Они выполняются быстрее обычных вызовов функций ввиду отсутствия накладных расходов по вызову функции для каждого символа (см. табл. 6.3 с некоторыми другими определениями из
<stdio.h>
).

stdin
Стандартный входной поток
stdout
Стандартный выходной поток
stderr
Стандартный поток диагностики
EOF
Конец файла; обычно -1
NULL
Несуществующий указатель; обычно 0
FILE
Используется для описания указателей на файлы
BUFSIZ
Обычно размер буфера ввода вывода (часто 512 или 1024)
getc(fp)
Возвращает один символ из потока
fp
getchar
getc(stdin)
putc(c,fp)
Помещает символ
с
в поток
fp
putchar(c)
putс(с,stdout)
feof(fp)
Не нуль, если достигнут конец файла для потока
fp
ferror(fp)
Не нуль, если в потоке
fp
есть ошибка
fileno(fp)
Дескриптор файла для потока
fp
(см. гл. 7)

Таблица 6.3: Некоторые определения из

<stdio.h>

Теперь вернемся снова к нашей теме и напишем третью версию

vis
. Если есть аргументы командной строки, они обрабатываются в порядке очередности, если же аргументов нет, используется стандартный входной поток.

/* vis: make funny characters visible (version 3) */

#include <stdio.h>

#include <ctype.h>

Поделиться:
Популярные книги

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

#Бояръ-Аниме. Газлайтер. Том 36

Володин Григорий Григорьевич
36. История Телепата
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 36

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Смерть пэра

Марш Найо
10. Родерик Аллейн
Детективы:
классические детективы
7.00
рейтинг книги
Смерть пэра

Чужак

Листратов Валерий
1. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Чужак

Черный Маг Императора 26

Герда Александр
26. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 26

Неучтенный элемент. Том 5

NikL
5. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 5

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Тринадцатый

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5