10.0 (Russian conspect)
На прошлом занятие мы не разобрались почему файл воспринимается как поток.
Файлы в си немногим отличаются от файлов в операционной системе. Помним, что си умеет подглядывать в следующий не введённый символ – такое умеют ungetc() и scanf().
Файлы бывают двух видов – текстовые и двоичные.
Есть такая конструкция как typedef которая позволяет задать новый тип – пример typedef struct _IO_FILE FILE;
Все операции, с которыми мы работали такие как getchar, scanf где мы не указывали с каким файлом они работают – они работали либо с stdin или stout в зависимости от того ввод это или вывод.
Есть функция read() которая читает из файла имеет следующие параметры дескриптор (не путать с индексом; дескриптор – номер файла, открытого вашей программой), второй аргумент это куда будет происходить чтение из файла, и последнее это количество байтов которые будут читаться.
Обратите внимание что никакой типизации в данном случае нет.
Обратите также внимание что read() возвращает некоторое значение – как обычно у нас функции на си возвращают значение даже если не подразумевает что она это делает.
Возвращаемое значение в таких случаях что-то в виде кода ошибки или количества проделанных операций.
Функция read() возвращает кол-во прочтенных байтов. Тип size_t беззнаковое целое.
Есть следующая программа:
Что она делает? Она читает по одному символу из файла stdin (помним, что ноль это stdin).
Помним, что командой ctrl+D можно закончить ввод в терминале (эту команду можно перенастроить, однако это не советуется делать, ибо можно запутаться).
Открытие файла open() у которого есть некоторые варианты – нас интересует только один – int open(const char *pathname, int flags);
Эта функция возвращает дескриптор.
O_APPEND дописывает в конец файла. Противоположный ему флаг O_TRUNC.
Временный файл — это файл, который открыт но в файловой системе его как бы нет.
В файловой системе лежат разные объекты. В файловой системе могут лежать обычные файлы, каталоги, символьные ссылки.