UNIX — универсальная среда программирования
Шрифт:
В табл. 6.2 перечислены некоторые средства работы со строками и ряд полезных функций, одна из которых
strcat(s,t) | Добавляет строку t к строке s ; возвращает s |
strncat(s,t,n) | Добавляет не более n символов t к s |
strcpy(s,t) | Копирует t в s ; возвращает s |
strncpy(s,t,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: Стандартные функции, выполняемые над строками
Измените аргумент
Доступность исходной программы на Си — одно из достоинств системы UNIX; такая программа демонстрирует элегантные решения многих программистских проблем. Прокомментируйте баланс между наглядностью программы на Си и встречающимися "оптимизированными" фрагментами, переписанными на Ассемблере.
6.3 Доступ к файлам:
Две первые версии
будет просматривать эти именованные файлы вместо стандартного входного потока. Если же имен файлов в качестве аргументов нет,
Возникает вопрос: как организовать чтение файлов, т.е. как связать имена файлов с операторами ввода вывода, реально читающими данные? Правила просты. Прежде чем быть прочитанным или записанным, файл должен быть открыт стандартной библиотечной функцией
Внутреннее имя является на самом деле указателем (называемым указателем файла) на структуру, содержащую информацию о файле, такую, как расположение буфера, текущую позицию символа в буфере, режим чтения или записи и т.п. Эта структура определяется в файле
Оно означает, что
Первый аргумент
Если файл, который вы открыли для записи или дописывания, не существует, он создается, если это возможно. Открытие для записи существующего файла вызывает уничтожение старого содержимого. Попытка читать несуществующий файл считается ошибкой, так же как и попытка читать или писать файл без разрешения. При возникновении ошибки
Далее, нужен способ читать или писать файл после того, как он открыт. Есть несколько способов, из которых использование
помещает в
помещает символ
Когда программа начинает выполняться, уже открыты три файла и имеются их указатели. Это стандартные потоки: входной, выходной и поток диагностики; соответствующие указатели называются
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: Некоторые определения из
Теперь вернемся снова к нашей теме и напишем третью версию