diff options
Create README.md
1 files changed, 103 insertions, 0 deletions
| -rw-r--r-- | Sem. 03/README.md | 103 |
diff --git a/Sem. 03/README.md b/Sem. 03/README.md new file mode 100644 index 0000000..082e324 --- /dev/null +++ b/Sem. 03/README.md @@ -0,0 +1,103 @@ +# Файлове (част 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**. + + + ### Позициониране във файл +TBI + + |
