1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# Файлове (част 2). Двоични файлове.
## Режими за работа с файлове
| Режим:| Ефект: |
|--------|------------------------------------------------------------------------------|
|ios::in |Отваря файл за четене (по подразбиране на ifstream) |
|ios::out |Отваря файл за четене (по подразбиране на ofstream) |
|ios::binary | Отваря файл в двоичен режим |
|ios::trunc | Ако файлът съществува, съдържанието му се изтрива след отваряне на поток |
|ios::app | Отваря файлът за вмъкване. Поставя put указателят в края. Не се допуска вмъкване преди края на потока |
|ios::ate | Отваря файлът за вмъкване. Поставя put указателят в края. Допуска вмъкване на прозиволни места |
|ios::nocreate | Отваря за вмъкване, само ако файлът с указаното име съществува.|
ios::noreplace | Отваря за вмъкване само ако файлът с указаното име не съществува.|
### Пример:
```c++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream f("test.txt", ios::out | ios::app);
if (!f.is_open())
{
cout << "Error while opening file!" << endl;
return -1;
}
f << 33; //appends at the end of the file
f.close();
return 0;
}
```
## Флагове на състоянията на потока
| Флаг:| Значение: |
|--------|------------------------------------------------------------------------------|
|bad() | Има загуба на информация. Някоя операция за четене и писане не е изпълнена. |
|fail() |Последната входно/изходна операция е невалидна.|
| eof() | Достигнат е края на файла. |
|good() | Всички операции са изпълнени успешно.|
|clear()| Изчиства състоянието на потока (Вече good() ще върне истина).|
## Двоични файлове.
Изпоилзваме функциите:
1. .read(char* memoryBlock, size_t size);
2. .write(const char* memoryBlock, size_t size);
Обърнете внимание, че функцията приема **char***. Ако искаме да запазим променлива от друг вид, ще трябва експлицитно да преобразуваме указателя към тип char* (без значение, че указателят не сочи към елементи от тип char)
### Пример за писане в двоичен файл:
```c++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream f("file.dat");
int a = 155555;
f.write((const char*)&a, sizeof(int));
return 0;
}
```
### Пример за четене от двоичен файл:
```c++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f("file.dat");
int a;
f.read((char*)&a, sizeof(int));
cout << a << endl;
return 0;
}
```
### Съдържанието на двоичния файл:

Байтовете се записват в **обратна посока**. Най-старшият байт е последен. Следователно запаментеното число е **00025fa3**, което е точно шестанйсетичния запис на числото **155555**.
### Примери за запазване на стуктури във файл.
- запазване на структура,която не използва динамична памет - **simple_struct_binary.cpp** и **student_staticName_to_binary.cpp**
- запазване на структура,която използва динамична памет - **students_dynamicName_to_binary.cpp**
### Позициониране във файл
TBI
|