**Файл** - поименованная последовательность байт на некотором внешнем носителе. 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 <iostream>
#include <fstream>
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 <iostream>
#include <string>
#include <fstream>
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 <iostream>
#include <fstream>
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++ для работы с файлами существует понятие **потока байтов**. Для работы с файловыми потоками подключается заголовочный файл `<fstream>`, после чего могут быть созданы объекты двух типов:
- поток ввода `ifstream`
- поток вывода `ofstream` 
  
Для открытия файла используется метод `open()`, для закрытия `close()`, функция для определения конца файла - `eof()`.
#### Текстовые файлы
Для вывода в поток и ввода из потока используются стандартные операции `<<` и `>>`. Если необходимо считать строку целиком - метод `getline()`.
```cpp
#include <iostream>
#include <fstream>
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 <iostream>
#include <fstream>
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<n;i++)
		cout << b[i].name << " " << b[i].age << " " << b[i].kurs << endl;


	fstream f2("input2.bin", ios::binary | ios::out);
	int a1 = 555, b1 = 666, c1 = 777;
	f2.write((char*)&a1, sizeof(a1));
	f2.write((char*)&b1, sizeof(b1));
	f2.write((char*)&c1, sizeof(c1));
	f2.close();

	f2.open("input2.bin", ios::binary | ios::in);
	while (f2.read((char*)&a1, sizeof(a1)))
		cout << a1 << endl;
	f2.close();
	system("pause");
	return 0;
}
```
