Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функции семейства
scanf
EOF
errno
Функция
scanf
□ традиционно их реализации полны ошибок;
□ в использовании эти функции не гибки;
□ они могут привести к созданию программного кода, в котором трудно решить, что подвергать синтаксическому анализу.
В качестве альтернативы попытайтесь применять другие функции, такие как
fread
fgets
Другие потоковые функции
В библиотеке stdio существует ряд других функций, использующих потоки как параметры или стандартные потоки
stdin
stdout
stderr
□
fgetpos
□
fsetpos
□
ftell
□
rewind
□
freopen
□
setvbuf
□
remove
unlink
path
rmdir
Эти библиотечные функции описаны на страницах интерактивного справочного руководства в разделе 3.
Вы можете использовать функции обработки файловых потоков для повторной реализации с их помощью программы копирования файлов. Взгляните на программу copy_stdio.c в упражнении 3.3.
Эта программа очень похожа на предыдущие версии, но посимвольное копирование выполняется с помощью вызовов функций, заданных в файле stdio.h:
#include <stdio.h>
#include <stdlib.h>
int main() {
int c;
FILE *in, *out;
in = fopen("file.in", "r");
out = fopen("file.out", "w");
while((c = fgetc(in)) != EOF) fputc(c, out);
exit(0);
}
Выполнив эту программу, как прежде, вы получите:
$ <b>TIMEFORMAT="" time ./copy_stdio</b>
0.06user 0.02system 0:00.11elapsed 81%CPU
Как это работает
На этот раз программа выполняется 0,11 с, не так быстро, как низкоуровневая блочная версия, но значительно быстрее другой посимвольной версии. Это произошло потому, что библиотека stdio поддерживает внутренний буфер в структуре
FILE
Ошибки потока
Для обозначения ошибок многие функции библиотеки stdio применяют значения за пределами допустимых, например, пустые указатели или константу
EOF
errno
<b>#include <errno.h></b>
<b>extern int errno;</b>
Имейте в виду, что многие функции могут изменять значение
errno
fprintf
errno
Вы можете также запросить состояние файлового потока, чтобы выяснить, возникла ли ошибка или достигнут конец файла.
<b>#include <stdio.h></b>
<b>int ferror(FILE *stream);</b>
<b>int feof(FILE *stream);</b>
<b>void clearerr(FILE *stream);</b>
Функция
ferror
Функция
feof
if (feof(some_stream))
/* Мы в конце */
Функция
clearerr
stream
Потоки и дескрипторы файлов
Каждый файловый поток ассоциирован с низкоуровневым дескриптором файла. Вы можете смешивать операции низкоуровневого ввода/вывода с высокоуровневыми потоковыми операциями, но это, как правило, неразумно, потому что трудно предсказать эффект от применения буферизации.
<b>#include <stdio.h></b>
<b>int fileno(FILE *stream);</b>
<b>FILE *fdopen(int fildes, const char *mode);</b>
Вы можете определить, какой низкоуровневый дескриптор файла применяется для файлового потока, вызвав функцию
fileno
fstat