**Файл** - поименованная последовательность байт на некотором внешнем носителе. C и C++ с файлами работает, как с текстовыми, и как с бинарными (двоичными). В первом случае считается, что каждый байт это код некоторого символа в кодировке ASCII. В случае бинарных файлов рассматривается 1 байт или группа байт, как данные некоторого типа. ## Файлы в языке C Для работы с файлом в C используется файловая переменная типа `FILE* имя`. Пример: ```c FILE* f; ``` После описания файл необходимо открыть командой `fopen(имя физического файла, режим доступа)`. Пример: ```c file = fopen("input.txt", "rt") ``` **Режим доступа** - это строка, указывающая режим открытия файла и тип файла. Типы: - `b` - бинарный - `t` - текстовый Режимы доступа: - `r` - открытие файла только для чтения - `w` - файл открывается только для записи. Если файла на диске нет, он создается, если есть - его данные стираются. - `a` - файл открывается для дозаписи в конец, или создается новый, если не существует - `r+` - для чтения и записи без уничтожения данных - `w+` - чтение и перезапись с созданием нового, если такого нет - `a+` - для чтения и дозаписи с созданием Работа с файлом часто производится циклом `while` до тех пор, пока не достигнут конец файла - функция `feof()`. Запись данных в файл производится функцией `fwrite()`, чтение - в зависимости от типа файла производится либо через `fread()`, либо `fgets()`. #### Текстовые файлы - `fprintf()` - вывод в файл - `fscanf()` - чтение с файла ```c #include #include using namespace std; int main() { FILE* f; f=fopen("input.txt", "rt"); char* str = new char[200]; while (!feof(f)) { fgets(str, 100, f); cout << str; } system("pause"); return 0; } ``` #### Бинарные файлы ``` A - 65 - 01000001 n - 110 - 01101110 t - 116 - 01110100 o - 111 - 01101111 n - 110 - 01101110 ``` ```c #include #include #include using namespace std; int main() { FILE* f; f = fopen("input.txt", "w+b"); char* str = new char[200]; int a = 12345, b = 54321, c = 999999, d = 55555555; fwrite(&a, sizeof(a), 1, f); fwrite(&b, sizeof(b), 1, f); fwrite(&c, sizeof(c), 1, f); fwrite(&d, sizeof(d), 1, f); fclose(f); f = fopen("input.txt", "rb"); while (!feof(f)) { fread(&a, sizeof(a), 1, f); if (!feof(f)) cout << a << endl; } system("pause"); return 0; } ``` ```cpp int main() { FILE* f; f = fopen("input.txt", "w+b"); int a[10] = { 1, 2, 3, 4 , 5, 6, 7, 8, 9, 10 }; int b[10]; fwrite(&a, sizeof(a), 1, f); fclose(f); f = fopen("input.txt", "rb"); fread(&b, sizeof(b), 1, f); for (int i = 0; i < 10; i++) cout << b[i] << endl; while (!feof(f)) fread(&a, sizeof(a), 1, f); fclose(f); system("pause"); return 0; } ``` ```c #include #include using namespace std; struct student { string name; int age; int kurs; }; int main() { FILE* f; const int n = 3; f = fopen("input.txt", "wb"); student a[n] = { {"Anton",18,1},{"Anton1",20,3},{"Anton2",21,1} }; fwrite(&n, sizeof(n), 1, f); fwrite(a, sizeof(a), 1, f); fclose(f); f = fopen("input.txt", "rb"); int k; fread(&k, sizeof(k), 1, f); student* b = new student[k]; fread(b, sizeof(b), 1, f)` fclose(f)` for (int i = 0; i < k; i++` cout << b[i].name << " " << b`" << b[i].kurs << endl; system("pause")` return 0 ``` `fclose()` - закрытие файла ## Файлы в языке C++ В C++ для работы с файлами существует понятие **потока байтов**. Для работы с файловыми потоками подключается заголовочный файл ``, после чего могут быть созданы объекты двух типов: - поток ввода `ifstream` - поток вывода `ofstream`  Для открытия файла используется метод `open()`, для закрытия `close()`, функция для определения конца файла - `eof()`. #### Текстовые файлы Для вывода в поток и ввода из потока используются стандартные операции `<<` и `>>`. Если необходимо считать строку целиком - метод `getline()`. ```cpp #include #include using namespace std; struct student { string name; int age; int kurs; }; int main() { ofstream f; const int n = 3; f.open("input.txt"); student a[n] = { {"Anton",18,1},{"Anton1",20,3},{"Anton2",21,1} }; for (int i = 0; i < n; i++) f << a[i].name << " " << a[i].age << " " << a[i].kurs << endl; f.close(); student b[n]; ifstream f1; f1.open("input.txt"); for (int i = 0; i < n; i++) f1 >> b[i].name >> b[i].age >> b[i].kurs; for (int i = 0; i < n; i++) cout << b[i].name << " " << b[i].age << " " << b[i].kurs << endl; f1.close(); system("pause"); return 0; } ``` #### Бинарные файлы При открытии файла вторым параметром можно указать режим открытия файла. По умолчанию файл рассматривается как текстовый. В случае бинарного файла он открывается как экземпляр класса `fstream`, после чего вторым параметром при открытии указывается либо `ios::binary | ios::in`, либо `ios::binary | ios::out`. Запись в файл производится методом `write(адрес буфера из которого делаем запись, размер буфера)`. Для чтения - метод `read(адрес буфера в котором идет чтение данных, размер буфера). ```cpp #include #include using namespace std; struct student { string name; int age; int kurs; }; int main() { fstream f; const int n = 3; f.open("input1.bin", ios::binary | ios::out); student a[n] = { {"Anton",18,1},{"Anton1",20,3},{"Anton2",21,1} }; f.write((char*)&a[0], sizeof(a)); f.close(); student b[n]; fstream f1; f.open("input1.bin", ios::binary | ios::in); f.read((char*)&b[0], sizeof(b)); f.close(); for (int i=0;i