Различия между версиями 1 и 2
Версия 1 от 2020-03-22 13:51:56
Размер: 3777
Редактор: Lecture_Uploads
Комментарий:
Версия 2 от 2020-06-08 23:31:50
Размер: 3785
Редактор: Lecture_Uploads
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 1: Строка 1:
== 10_FileIO == = 10.0 (Russian conspect) =
Строка 57: Строка 57:

10.0 (Russian conspect)

На прошлом занятие мы не разобрались почему файл воспринимается как поток.

Файлы в си немногим отличаются от файлов в операционной системе. Помним, что си умеет подглядывать в следующий не введённый символ – такое умеют ungetc() и scanf().

Файлы бывают двух видов – текстовые и двоичные.

Есть такая конструкция как typedef которая позволяет задать новый тип – пример typedef struct _IO_FILE FILE;

Все операции, с которыми мы работали такие как getchar, scanf где мы не указывали с каким файлом они работают – они работали либо с stdin или stout в зависимости от того ввод это или вывод.

Есть функция read() которая читает из файла имеет следующие параметры дескриптор (не путать с индексом; дескриптор – номер файла, открытого вашей программой), второй аргумент это куда будет происходить чтение из файла, и последнее это количество байтов которые будут читаться.

Обратите внимание что никакой типизации в данном случае нет.

Обратите также внимание что read() возвращает некоторое значение – как обычно у нас функции на си возвращают значение даже если не подразумевает что она это делает.

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

Функция read() возвращает кол-во прочтенных байтов. Тип size_t беззнаковое целое.

Есть следующая программа:

   1 #include <stdio.h>
   2 #include <unistd.h>
   3 
   4 int main(int argc, char *argv[])
   5 {
   6         char c;
   7         while(read(0,  &c, 1)) {
   8                 c++;
   9                 write(1, &c, 1);
  10 
  11         }
  12         return 0;
  13 }

Что она делает? Она читает по одному символу из файла stdin (помним, что ноль это stdin).

Помним, что командой ctrl+D можно закончить ввод в терминале (эту команду можно перенастроить, однако это не советуется делать, ибо можно запутаться).

Открытие файла open() у которого есть некоторые варианты – нас интересует только один – int open(const char *pathname, int flags);

Эта функция возвращает дескриптор.

O_APPEND дописывает в конец файла. Противоположный ему флаг O_TRUNC.

Временный файл — это файл, который открыт но в файловой системе его как бы нет.

В файловой системе лежат разные объекты. В файловой системе могут лежать обычные файлы, каталоги, символьные ссылки.

HSE/ProgrammingOS/10_FileIO/Conspect (последним исправлял пользователь Lecture_Uploads 2020-06-08 23:31:50)