Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция2013.docx
Скачиваний:
7
Добавлен:
31.03.2015
Размер:
72.11 Кб
Скачать

1.3.3.9. Функции scanf() и fscanf(). Ввод данных с преобразованием формата.

Функции считывают вводимую информацию в соответствии с форматом format . Этот формат может включать в себя определители преобразования; результаты каждого преобразования, если они производились, будут сохраняться c помощью параметров указателя. Функция scanf считывает информацию, прибывающую из стандартного потока ввода stdinfscanf считывает информацию из потока, на который указывает stream

1.3.3.10. Функция feof(). Проверка конца файла.

feof проверяет, был ли достигнут конец файла, на который указывает fp.

feof возвращает 0, если конец файла еще не был достигнут, и ненулевое значение в противном случае.

Стандарт ANSI требует наличия функции feof.

Никаких процедур ОС не требуется.

3.3.4.11. Функция ferror(). Проверка на возникновение ошибки ввода/вывода.

Функция ferror проверяет ошибки чтения и записи заданного потока. При возникновении ошибки индикатор ошибки stream остается установленным до тех пор, пока поток не закроется или "разрушится" (rewound) или же пока не будет вызвана функция clearerr.

В случае обнаружения ошибки в потоке функция ferror возвращает ненулевое значение. Возвращаемое значение 0 свидетельствует об отсутствии ошибки.

Пример 6

  1. Примеры программ

2.1. Пример 1. Системные вызовы open() и close()

Стоит обратить внимание на то, что если запустить программу дважды с одним и тем же аргументом, то на второй раз open() выдаст ошибку. В этом виноват флаг O_EXCL, который "дает добро" только на создание еще не существующих файлов. Наглядности ради, флаги открытия и флаги режима были занесены в отдельные переменные, однако можно было бы сделать так:

fd = open (argv[1], O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);

Или так:

fd = open (argv[1], O_WRONLY | O_CREAT | O_EXCL, 0600);

2.2. Пример 2. Системный вызов read()

В этом примере используется укороченная версия open(), так как файл открывается только для чтения. В качестве буфера (второй аргумент read()) передается адрес переменной типа char. По этому адресу будут считываться данные из файла (по одному байту за раз) и передаваться на стандартный вывод. Цикл чтения файла заканчивается, когда read() возвращает нуль (нечего больше читать) или -1 (ошибка). Системный вызов close() закрывает файл.

Как можно заметить, в данном примере системный вызов read() вызывается ровно столько раз, сколько байт содержится в файле. Иногда это действительно нужно; но не здесь. Чтение-запись посимвольным методом (как в примере) значительно замедляет процесс ввода-вывода за счет многократных обращений к системным вызовам. По этой же причине возрастает вероятность возникновения ошибки. Если нет действительной необходимости, файлы нужно читать блоками. Ниже приведен исходный код программы, которая делает то же самое, что и предыдущий пример, но с использованием блочного чтения файла. Размер блока установлен в 64 байта.

2.3. Пример 3. Системный вызов write()

В этом примере нам уже не надо изощряться в попытках вставить нуль-терминатор в строку для записи, поскольку системный вызов write() не запишет большее количество байт, чем мы ему указали. В данном случае для демонстрации write() мы просто записывали данные в файл с дескриптором 1, то есть в стандартный вывод.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]