Язык программирования Си. Глава(Chapter) 13
Tags: c, russian
Published: 2022-06-24 17:57:56

1. Файл — это именованный раздел хранилища на твердотельном диске. В C файл — это непрерывная последовательность байтов, каждый из которых может быть прочитан индивидуально. Указатель на файл(не ссылается на действительный файл) — это указатель на объект данных, то есть struct, содержащий информацию о файле, включая сведения о буфере.

2. Текстовый - побайтовый и подстраивающийся под систему - режим и двоичный - битовый - режим(The Text Mode and the Binary Mode)

3. Уровни ввода-вывода(Levels of I/O): низкоуровневый(системно-зависимый) ввод-вывод(Low-level I/O) и стандартный( в stdio.h) высокоуровневый(переносимый, гибкий и буферизированный) ввод-вывод(Standard high-level I/O)

4. Автоматическое открытие программой на C файлов стандартного ввода(standard input), стандартного вывода(standard output) и стандартного вывода ошибок(standard error output)(при перенаправлении всё равно выводится на экран)

5. Строки режима(Mode Strings) функции fopen()(r - read, w -  write, a - append, + - update, b - binary, x - exclusive): r, w, a, r+, w+, a+, rb, wb, ab, ab+, a+b, wb+, w+b; вдобавок wx, wbx, w+x, wb+x, w+bx в C11

6. Файловый ввод-вывод(File I/O): fopen()(возвращает указатель файла(file pointer) при успешном открытии и NULL в обратном случае) для открытия потока данных(open a stream) и fclose()(возвращает 0 при успешном закрытии и EOF в обратном случае), rewind()(возврат в начало файла), getc() и putc()(первообразные getchar() и putchar()), fprintf() и fscanf(), fgets()(возвращает NULL, если считывает EOF) и fputs()

7. Другие функции: fseek()(возвращает 0 при успешном и -1 при неудачном выполнении) гарантированно работает в текстовом режиме с SEEK_SET(начало файла), SEEK_CUR(текущее положение в файле), SEEK_END(конец файла, не обязательно поддерживается в двоичном режиме) в stdio.h, ftell()(текущая позиция от начала файла), fgetpos() и fsetpos() с fpos_t в  ANSI C(для работы с большими файлами), ungetc()(возврат символа в поток), fflush()(сброс(flushing) незаписанных данных из буфера в выходной файл), , feof()(возвращает ненулевое значение, если при последнем вызове функции ввода был обнаружен конец файла, и ноль в противном случае), ferror()(возвращает ненулевое значение, если произошла ошибка чтения или записи, и ноль в противном случае), также альтернативный буфер для стандартного ввода-вывода(вызывается после того, как файл был открыт, и перед выполнением любой другой операции на потоке данных) setvbuf()(прототип int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);) в ANSI C, где fp — идентификатор потока, buf(например char buf[1024];) — идентификатор буфера(если NULL, то функция сама выделит память под буфер), mode — полная(_IOFBF), построчная(_IOLBF) и отсутствие(_IONBF) буферизации, а size — размер буфера(обычно кратен размеру объекта данных); возвращает ноль при успешном создании буфера

8. Двоичные fread() и fwrite() с прототипами size_t fread/fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);, где ptr(универсальный указатель) — адрес порции данных, size — размер порции данных в байтах, nmemb — количество порций, а fp — идентификатор файла; возвращают количество успешно записанных или прочитанных элементов(обычно равное nmemb или меньше, если произошла ошибка или достигнут конец файла)

```c
struct FILE
{
    struct FILE * fp;
    char * file_name;
    int error_code;
    int is_eof;
    char buffer[512];
    char * buffer_set;
    int copied_bytes;
    int buffer_position;
};
```

> Язык программирования Си 6 издание. Стивен Прата
> C Primer Plus 6th edition. Stephen Prata