Тема:Стандартный ввод и стандартный вывод. Стандартный вывод диагностики.
Системные вызовы. Переменная errno.
Цель: Научиться работать со стандартными функциями, предоставляющими доступ к
Стандартному вводу выводу и выводу диагностики.
Порядок выполнения работы:
1. Выучить основные понятия стандартного ввода/вывода, вывода диагностики и назначение переменной errno.
2. Проанализировать результаты и сделать вывод.
Теоретические сведения:
PERROR
perror - выводит сообщение о системной ошибке
СИНТАКСИС
#include <stdio.h>
void perror(const char *s);
#include <errno.h>
const char *sys_errlist[];
int sys_nerr;
int errno;
ОПИСАНИЕ
Функция perror() выводит в стандартный поток ошибки сообщения, описывая ошибку, произошедшую при последнем системном вызове или вызове библиотечной функции. Сначала (если s не равно NULL и *s не равно NULL) выводится строка s, затем двоеточие, пробел и сообщение, завершающееся переводом строки. Для большего удобства параметры строки должны содержать имя функции, вызвавшей ошибку. Номер ошибки извлекается из внешней переменной errno, которая устанавливается в случае ошибки, но не "очищается" в случае нормального завершения работы. Глобальный список ошибок sys_errlist[], упорядоченный в соответствии с errno, может быть использован для вывода сообщений об ошибке без перевода строки. Наибольший номер в таблице имеет sys_nerr -1. Будьте осторожны при непосредственном использовании этого массива. Новые элементы не могут быть вписаны в sys_errlist[]. Если системный вызов завершается ошибкой, то возвращается -1 и переменная errno устанавливается равной коду ошибки (эти величины могут быть найдены в <errno.h>). Многие системные функции работают именно так. Функция perror() позволяет отображать коды ошибок в понятном человеку виде. Заметьте, что errno не является определенной после нормального завершения системного вызова: этот вызов может изменить переменную кода ошибки, даже если завершился удачно (например, потому, что он использовал другие функции, завершившиеся ошибкой). Таким образом, если за вызовом, завершившимся ошибкой, непосредственно не следует perror, то величина errno должна быть сохранена.
Макросы и функции, относящиеся к разделу stdio предоставляют пользователю эффективные средства буферизованного ввода/вывода. Макросы gets() и puts() служат для быстрого ввода/вывода символов. Макросы getchar и putchar и функции более высокого уровня fgetc, fgets, fprintf, fputc, fputs, fread, fscanf, fwrite, gets, getw, printf, puts, putw и scanf ведут себя так, как если бы они использовали getc и putc. Обращения к макросам и функциям из данного пакета можно чередовать произвольным образом.
Файл и ассоциированный с ним механизм буферизации называются потоком. Поток описывается как указатель на переменную типа FILE. Функция fopen() создает описатель потока и возвращает указатель на него. Этот указатель идентифицирует поток во всех последующих операциях. Обычно имеются три открытых потока с постоянными указателями, они описаны во включаемом файле <stdio.h> и связаны со стандартными открытыми файлами:
stdin - стандартный ввод = 0
stdout - стандартный вывод = 1
stderr - стандартный протокол = 2
Константа NULL (0) обозначает пустой указатель.
Целая константа EOF (-1) возвращается по достижении конца файла или в случае ошибки большинством из целочисленных функций, работающих с потоками.
Целая константа BUFSIZ специфицирует размер буферов, используемых в конкретной реализации.
Любая программа, использующая данный пакет ввода/вывода, должна включать файл соответствующих макроопределений следующим образом:
#include <stdio.h>
Потоки вывода, за исключением стандартного протокола stderr, по умолчанию буферизуются, если вывод производится в файл, и буферизуется построчно, если вывод производится на терминал. Стандартный протокол stderr по умолчанию не буферизуется, но использование функции freopen приводит к тому, что стандартный протокол становится буферизованным или буферизованным построчно. Когда поток вывода не буферизован, данные выводятся в нужный файл или на терминал по мере поступления запросов на запись; когда поток вывода буферизован, байты накапливаются и записываются блоком. Когда поток вывода буферизован построчно, каждая выводимая строка выводится на терминал после заполнения строки (то есть, как только выводится символ перевода строки или поступает запрос на ввод с терминала). Функции setbuf или setvbuf могут использоваться для изменения стратегии буферизации потоков.
GETS
fgetc, fgets, getc, getchar, gets, ungetc - функции для ввода символов и строк
СИНТАКСИС
#include <stdio.h>
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
int ungetc(int c, FILE *stream);
ОПИСАНИЕ
fgetc() считывает очередной символ из потока stream и возвращает преобразованный unsigned char в int или возвращает константу EOF по достижении конца файла или при возникновении ошибки.
getc() похожа на fgetc(), но она может быть реализована как макрос, который определяет состояние stream более одного раза.
getchar() эквивалентна getc(stdin).
gets() считывает строку из stdin и записывает ее в буфер, на который указывает s, пока не встретится символ новой строки или EOF, которые заменяются значением '\0'. Проверка на переполнение буфера не производится.
fgets() считывает максимум size - 1 символов из stream и заносит их в буфер, на который указывает s. Чтение прерывается по достижении EOF или символа новой строки. Если считан символ новой строки, то он заносится в буфер. В конце к строке добавляется '\0'.
ungetc() заносит c обратно в stream, преобразует в unsigned char, если это возможно для дальнейших операций чтения. Занесенные обратно символы будут возвращаться в обратном порядке; гарантируется только одно занесение символов.
Вызовы функций, описанные здесь, могут смешиваться друг с другом и с другими функциями ввода из библиотеки stdio для того же потока ввода.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
fgetc(), getc() и getchar() возвращают символ, считанный как unsigned char и преобразованный в int; а также возвращают EOF по достижении конца файла или при возникновении ошибки.
gets() и fgets() возвращают s при удачном завершении операции и NULL при ошибке или если достигнут конец файла, а символы остались несчитанными.
ungetc() возвращает c при удачном завершении операции или EOF при возникновении ошибки.
PUTS
fputc, fputs, putc, putchar, puts - выводят символы или строки
СИНТАКСИС
#include <stdio.h>
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);
ОПИСАНИЕ
fputc() выводит символ c, приведенный к виду unsigned char, в поток stream.
fputs() выводит строку s в поток stream без завершающего символа '\0'.
Функция putc() эквивалентна fputc() , так что она может быть реализована как макрос.
putchar(c); полностью эквивалентна putc(c,stdout).
puts() записывает строку s и завершающий перевод строки в stdout.
Функции, перечисленные выше, могут быть использованы друг с другом или вместе с другими функциями ввода/вывода из библиотеки stdio .
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
fputc(), putc() и putchar() возвращают символ, описанный как unsigned char и приведенный к типу int , или EOF в случае ошибки.
puts () и fputs() возвращают неотрицательное число в случае удачного завершения вызова или EOF в случае ошибки.