FreeSource: Статьи/КраткоОбоВсём/Clang/part2/part2

2.2 Функции для работы с дисками, директориями и файлами

2.2.1 Функции потокового ввода-вывода

fopen, fdopen, freopen (POSIX) <stdio.h>

FILE *fopen(const char *path, const char *mode);

FILE *fdopen(int fildes, const char *mode);

FILE *freopen(const char *path, const char *mode, FILE *stream);

fopen – открывает файл с именем path и связывает его с потоком.

fdopen – связывает поток с существующим описателем файла <fildes>.

freopen – открывает файл с именем path и связывает его с потоком stream. Исходный поток (если такой существовал) закрывается.

fclose (POSIX) <stdio.h>

int fclose( FILE *stream);

Закрывает поток <stream>.

feof (POSIX) <stdio.h>

int feof(FILE *stream);

Возвращает не ноль если достигнут конец файла (EOF) потока <stream>.

ferror (POSIX) <stdio.h>

int ferror(FILE *stream);

Возвращает не ноль если установлен признак ошибки чтение потока.

fgetc, getc, getchar (POSIX) <stdio.h>

int fgetc(FILE *stream);

int getc(FILE *stream);

int getchar(void);

Считывает символ из потока <stream> или из stdin.

fgets, gets (POSIX) <stdio.h>

char *fgets(char *restrict s, int n, FILE *restrict stream);

char *gets(char *s);

Чтение строки из потока <stream> или из STDIN в буфер <s> размером <n>.

fgetwc, getwc (POSIX) <stdio.h, wchar.h>

wint_t fgetwc(FILE *stream);

wint_t getwc(FILE *stream);

Считывает широкий символ из потока <stream>.

fgetws (POSIX) <wchar.h>

wchar_t *fgetws(wchar_t *ws, int n, FILE *stream);

Чтение строки широких символов из потока <stream> в буфер <ws> размером <n>.

fprintf (POSIX) <stdio.h>

int fprintf(FILE *stream, const char *format, ...);

Осуществляет форматированный вывод в поток <stream> (Табл.10).

fputc, putc (POSIX) <stdio.h>

int fputc(int c, FILE *stream);

int putc(int c, FILE *stream);

Помещает символ в поток <stream>.

fputs, puts (POSIX) <stdio.h>

int fputs(const char *restrict s, FILE *restrict stream);

int puts(const char *s);

Помещает строку <s> в поток <stream> или в STDOUT.

fputwc, putwc (POSIX) <stdio.h, wchar.h>

wint_t fputwc(wchar_t wc, FILE *stream);

wint_t putwc(wchar_t wc, FILE *stream);

Помещает широкий символ в поток <stream>.

fputws (POSIX) <wchar.h>

int fputws(const wchar_t *ws, FILE *stream);

Помещает строку широких символов <s> в поток <stream>.

fread (POSIX) <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

Чтение блоков данных <nmemb> размером <size> каждый из потока <stream> в буфер <ptr>. Возвращается количество удачно прочитаных блоков.

fseek, fseeko, fsetpos (POSIX) <stdio.h>

int fseek(FILE *stream, long offset, int whence);

int fseeko(FILE *stream, off_t offset, int whence);

int fsetpos(FILE *stream, const fpos_t *pos);

Установка позиции в потоке <stream> в соответствии с правилом <whence> и смещением <offset>. В случае с fsetpos позиция устанавливается из структуры <pos>.

fflush (POSIX) <stdio.h>

int fflush(FILE *stream);

«Сбрасывает» буферы потока <stream>.

ftell, ftello, fgetpos (POSIX) <stdio.h>

long ftell(FILE *stream);

off_t ftello(FILE *stream);

int fgetpos(FILE *restrict stream, fpos_t *restrict pos);

Получение текущей позиции в потоке <stream>. В случае с fgetpos выполняется заполнение структуры <pos>.

fwrite (POSIX) <stdio.h>

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Запись в поток <stream> блоков данных <nmemb> размером <size> каждый из буфера <ptr>. Возвращается количество удачно записанных блоков.

perror (POSIX) <stdio.h>

void perror(const char *s);

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

rewind (POSIX) <stdio.h>

void rewind(FILE *stream);

Сброс указателя позиции потока <stream>.

setbuf, setvbuf (POSIX) <stdio.h>

void setbuf(FILE *restrict stream, char *restrict buf);

int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size);

Установка правила буферизации потока <stream>. Если <buf> равно NULL, то буферизации отключается. Режим буферизации указывается в <type>: _IOFBF(полная буферизация), _IOLBF(построчная), _IONBF(отсутствие).

Таблица 9. Символы управления форматированием функций типа printf()

Элемент
Эффект
%[флаги][ширина][.точность][F | N | h | l]<тип>
Флаги
0Для чисел, ширина поля слева будет заполнена нулям.
-Производится выравнивание выводимого числа по левому краю в пределах выделенного поля. Правая сторона выделенного поля дополняется пробелами.
+Выводится знак числа символом '-' или '+'
*Обозначает пропуск при вводе поля, определенного данной спецификацией. Введенное значение не присваивается ни какой переменной.
<Пробел>Выводится пробел перед положительным числом и знак '-' перед отрицательным.
# Выводится идентификатор системы счисления для целых:

  • 0 перед числом в восьмеричной с/c;
  • 0х или 0Х в шеснадцатеричной с/c;
  • ничего для чисел в десятичной с/c.
Ширина (воздействует только на вывод)
nОпределяет минимальную ширину поля в <n> символах. Если после преобразозования ширины недостаточно, то выводится столько символов сколько есть, с дополнением пробелами.
0nВсе тоже, но позиции слева для целого числа дополняются нулям.
*Число выводимых символов определяется значением соответствующей переменной.
Точность (воздействует только на вывод)
<ничего>Точность по умолчанию.
.0Для d, i, o, u, x – точность по умолчанию. Для e, E, f – десятичная точка отсутствует.
.nДля e, E, f не более <n> знаков после точки.
*Следующий аргумент из списка аргументов – точность.
Модификатор (воздействует там, где применимо)
hПеред d, i, o, u, x, X аргумент является – short int.
lПеред d, i, o, u, x, X аргумент является – long int. Перед e, E, f, g, G аргумент является – double (только для scanf).
LДлиное двойной точности.
FУказатель (FAR).
NУказатель (NEAR).
Поле образец – %[*][ширина] [образец]
Определяет множество символов, из которых может состоять вводимая строка. Если в образце стоит символ '^', то вводится будут все символы кроме перечисленных: [a-z],[A-F0–9]; [^0–9]
Тип переменной: char
cПри вводе, читается и передается переменной один байт. При выводе – байт переменной преобразуется к типу char и записуется в выходной поток.
Тип переменной: int
dДесятичное int со знаком.
iДесятичное int со знаком.
oВосьмеричное int без знака.
uДесятичное int без знака.
xШеcтнадцатеричное int без знака (0 – f).
XШестнадцатеричное int без знака (0 – F).
nУказатель NEAR (только смещение).
pУказатель FAR (сегмент[селектор]:смещение).
Тип переменной: float
fЗначение со знаком в форме [-]dddd.dddd .
eЗначение со знаком в форме [-]d.dddde[+ | -]ddd .
EЗначение со знаком в форме [-]d.ddddE[+ | -]ddd .
gЗначение со знаком в формате 'e' или 'f' в зависимости от значения и специфицированной точности.
GЗначение со знаком в формате 'E' или 'F' в зависимости от значения и специфицированной точности.
Тип переменной: char *
sПри вводе принимает символы без преобразования до тех пор, пока не встретится '\n' или пока не достигнута специфицированная точночть. При выводе выдаёт в поток все символы до тех пор пока не встретится '\0' или не достигнута специфицированная точность.

2.2.2 Работа с директориями

chdir, fchdir (POSIX) <unistd.h>

int chdir(const char *path);

int fchdir(int fd);

Установка текущей директории <path>, <fd>.

ftw, nftw <ftw.h>

int ftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth);

int nftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags);

Перемещается по дереву каталогов, начиная с указанного каталога <dir>. Для каждого найденного элемента дерева вызываются: <fn()> с указанием полного имени этого элемента, указатель на структуру элемента <stat> и целое число. Функция nftw() выполняет то же самое, что и ftw(), только имеет еще один параметр, flags, то есть вызывает свои функции еще с одним параметром.

getcwd (POSIX) <unistd.h>

char *getcwd(char *buf, size_t size);

Копирует абсолютный путь к текущему рабочему каталогу в массив <buf>, имеющий длину <size>.

mkdir (POSIX) <sys/stat.h, sys/types.h>

int mkdir(const char *pathname, mode_t mode);

Создаёт каталог <pathname> с режимом <mode>.

opendir, closedir (POSIX) <sys/types.h, dirent.h>

DIR *opendir(const char *name);

int closedir(DIR *dir);

Открывает/закрывает поток каталога, соответствующий каталогу <name>.

readdir (POSIX) <sys/types.h, dirent.h>

struct dirent *readdir(DIR *dir);

Возвращает указатель <dir> на следующую запись каталога.

rmdir (POSIX) <unistd.h>

int rmdir(const char *pathname);

Удаляет каталог <pathname>.

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

access (POSIX) <unistd>

int access(const char *pathname, int mode);

Проверка, имеет ли процесс <pathname> права <mode> на чтение(R_OK), запись(W_OK), выполнение(X_OK) или существование файла(F_OK).

close (POSIX) <unistd.h>

int close(int fd);

Закрывает открытый описатель файла <fd>.

creat (POSIX) <sys/types.h, sys/stat.h, fcntl.h>

int creat(const char *pathname, mode_t mode);

Создаёт файл <pathname> и возвращает его описатель.

dup, dup2 (POSIX) <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

dup – предоставляет новому описателю наименьший свободный номер. dup2 – делает <newfd> копией <oldfd> (если это необходимо), закрывая newfd.

fcntl (POSIX) <unistd.h, fcntl.h>

int fcntl(int fildes, int cmd, ...);

Выполняет различные операции <cmd> над файловым дескриптором <fildes>.

flock (BSD) <sys/file.h>

int flock(int fd, int operation);

Устанавливает или снимает <operation> «мягкую» блокировку открытого файла <fd>.

fsync, fdatasync (POSIX) <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

fsync – копирует все части файла, находящиеся в памяти, на устройство <fd>. fdatasync – тоже что и fsync, но без метаданных.

fileno (ANSI) <stdio.h>

int fileno(FILE *stream);

Возвращает описатель <stream>.

link (POSIX) <unistd.h>

int link(const char *oldpath, const char *newpath);

Создание ссылки <newpath> на файл <oldpath>.

lseek (POSIX) <sys/types.h, unistd.h>

off_t lseek(int fildes, off_t offset, int whence);

Устанавливает позицию чтения/записи информации в файле.

mknod (BSD) <sys/types.h, sys/stat.h, fcntl.h, unistd.h>

int mknod(const char *pathname, mode_t mode, dev_t dev);

Создаёт файл (обычный файл, файл устройства или именованный канал) <pathname>, с правами доступа <mode> и дополнительной информацией <dev>.

open (POSIX) <sys/types.h, sys/stat.h, fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

Открывает файл <pathname> и возвращает описатель файла.

pathconf, fpathconf (POSIX) <unistd.h>

long pathconf(char *path, int name);

long fpathconf(int filedes, int name);

Получение значения конфигурационной опции для указанного файла <path>, <filedes>. Конфигурационные опции:

_PC_LINK_MAX — максимальное количество ссылок на файл;

_PC_NAME_MAX — максимальная длина имени файла в полном имени;

_PC_PATH_MAX — максимальная длина полного имени указанного файла;

_PC_PIPE_BUF — размер указанного канала.

read, readv (POSIX) <unistd.h, sys/uio.h>

ssize_t read(int fd, void *buf, size_t count);

int readv(int fd, const struct iovec * vector, int count);

Записывает <count> байтов файлового описателя <fd> в буфер <buf> или вектор <vector>.

readlink (POSIX) <unistd.h>

ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize);

Помещает содержимое символьной ссылки <path> в буфер <buf> длиной <bufsiz>.

remove (ANSI,POSIX) <stdio.h>

int remove(const char *pathname);

Удаляет имя файла и, возможно, сам файл.

rename (ANSI) <unistd.h>

int rename(const char *oldpath, const char *newpath);

Изменяет имя или расположение файла <oldpath> на <newpath>.

select (POSIX) <sys/time.h, sys/types.h, unistd.h>

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

int pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, sigset_t *sigmask);

Ждут изменения статуса нескольких файловых описателей в течении <timeout>. n – на единицу больше самого большого номера описателей из всех наборов. Для манипуляции набором существуют 4 макроса:

sendfile (*) <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

Производит чтение данных из <in_fd> по смещению <offset> длиной <count> и запись их в <out_fd>.

stat, fstat, lstat (POSIX) <sys/types.h, sys/stat.h, unistd.h>

int stat(const char *file_name, struct stat *buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *file_name, struct stat *buf);

stat – возвращает информацию о файле <file_name> и заполняет буфер <buf>;

lstat – дополнительно информацию о ссылке;

fstat – информацию о <filedes>.

statvfs, fstatvfs (POSIX) <sys/statvfs.h>

int statvfs(const char *path, struct statvfs *buf);

int fstatvfs(int fd, struct statvfs *buf);

Получение информации о файловой системе на которой расположен файл <path>, <fd>.

symlink (POSIX) <unistd.h>

int symlink(const char *oldpath, const char *newpath);

Создание символьной ссылки <newpath> на файл <oldpath>.

write, writev (POSIX) <unistd.h, sys/uio.h>

ssize_t write(int fd, const void *buf, size_t count);

int writev(int fd, const struct iovec * vector, int count);

Записывает <count. байтов из буфера <buf> или вектора <vector> в файл <fd>.

unlink (POSIX) <unistd.h>

int unlink(const char *pathname);

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

Таблица 10. Стандартные потоки ввода-вывода

ИмяНазначение
stdin(0)Стандартный вход;
stdout(1)Стандартный выход (буфериз.);
stderr(2)Стандартный выход ошибок (небуфериз.);

2.2.4 Функции работы с временными файлами

mkstemp (BSD) <stdlib.h>

int mkstemp(char *template);

Создает временный файл с уникальным именем определённым <template>. <template> должен иметь в конце символы “XXXXXX”. Возвращает описатель fd созданного файла и заполняет XXXXXX, в template, сгенерированными символами. Нуждается в удалении!

mktemp (POSIX) <stdlib.h>

char *mktemp(char *template);

Создает временный файл с уникальным именем определённым <template>. <template> должен иметь в конце символы “XXXXXX”. Возвращает имя созданного файла.

tmpfile (POSIX) <stdio.h>

FILE *tmpfile (void);

Создает уникальное имя временного файла с помощью префикса пути P_tmpdir, определенного в <stdio.h>. Файл автоматически удаляется при его закрытии или в случае завершения основной программы.