Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 03
diff options
context:
space:
mode:
Commit47e7a34e2d3576b0e8e5159bbd2f91984bd5c612 (patch)
Author
 Angeld55 <angel_dimitriev@abv.bg>
2021-03-12 14:19:34 +0200
Committer
 Angeld55 <angel_dimitriev@abv.bg>
2021-03-12 14:19:34 +0200
Filesf2c012f37b51f1f0b9e846fdc942a1cc5a4e3b57 /Sem. 03
Object-oriented_programming_FMI-47e7a34e2d3576b0e8e5159bbd2f91984bd5c612.tar
Object-oriented_programming_FMI-47e7a34e2d3576b0e8e5159bbd2f91984bd5c612.tar.gz
Object-oriented_programming_FMI-47e7a34e2d3576b0e8e5159bbd2f91984bd5c612.zip
Parent1600ff61592b3fd94fb9029531fe35c0ed82cdf7 (diff)
added sem 3
3 files changed, 154 insertions, 0 deletions
-rw-r--r--Sem. 03/README.md127
-rw-r--r--Sem. 03/binaryFileExample.cpp0
-rw-r--r--Sem. 03/sizeFile.cpp27
diff --git a/Sem. 03/README.md b/Sem. 03/README.md
new file mode 100644
index 0000000..efd06d2
--- /dev/null
+++ b/Sem. 03/README.md
@@ -0,0 +1,127 @@
+# Файлове (част 2). Двоични файлове.
+
+## Режими за работа с файлове
+
+
+| Режим:| Ефект: |
+|--------|------------------------------------------------------------------------------|
+|ios::in |Отваря файл за четене (по подразбиране на ifstream) |
+|ios::out |Отваря файл за четене (по подразбиране на ofstream) |
+|ios::binary | Отваря файл в двоичен режим |
+|ios::trunc | Ако файлът съществува, съдържанието му се изтрива след отваряне на поток |
+|ios::app | Отваря файлът за вмъкване. Поставя put указателят в края. Не се допуска вмъкване преди края на потока |
+|ios::ate | Отваря файлът за вмъкване. Поставя put указателят в края. Допуска вмъкване на прозиволни места |
+### Пример:
+ ```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() ще върне истина).|
+
+## Позициониране във файл
+
+ - tellg() - Връща позцития на текущия символ в **потока за четене**
+ - tellp() - Връща позцития на текущия символ в **потока за писане**
+ - seekg(offset, direction) - Премества get-указателят на позцития на **потока за четене**.
+ - seekp(offset, direction) - Премества put-указателят на позцития на **потока за писане**.
+
+
+ -**offset** : целочислена стойност. Отместването от direction.
+
+ -**direction** : Може да заема следите стойностти:
+
+1. ios::base::beg - началото на файла.
+2. ios::base::cur - текущата позиция във файла.
+3. ios::base::end - края на файла.
+
+### Пример:
+ ```c++
+#include <iostream>
+#include <fstream>
+using namespace std;
+size_t getFileLen(std::ifstream& ifs) //we can pass stream to functions.
+{
+
+ ifs.seekg(0, std::ios::end); //set the position at the end of the file
+ size_t size = ifs.tellg(); //get the curren position
+ ifs.seekg(0, std::ios::beg); //set the position at the beginning
+
+ return size;
+}
+ ```
+## Двоични файлове.
+
+Изпоилзваме фунцкиите:
+
+1. .read(char* memoryBlock, size_t size);
+2. .write(char* memoryBlock, size_t size);
+
+Обърнете внимание, че функцията приема **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;
+}
+ ```
+
+ ### Съдържанието на двоичния файл:
+ ![enter image description here](https://i.ibb.co/G3R72qG/sudurjanie.png "Binary file example")
+
+Байтовете се записват в **обратна посока**. Най-старшият байт е последен. Следователно запаментеното число е **00025fa3**, което е точно шестанйсетичния запис на числото **155555**.
+
diff --git a/Sem. 03/binaryFileExample.cpp b/Sem. 03/binaryFileExample.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Sem. 03/binaryFileExample.cpp
diff --git a/Sem. 03/sizeFile.cpp b/Sem. 03/sizeFile.cpp
new file mode 100644
index 0000000..862d565
--- /dev/null
+++ b/Sem. 03/sizeFile.cpp
@@ -0,0 +1,27 @@
+#include <iostream>
+#include <fstream>
+
+using namespace std;
+
+size_t getFileSize(const char* fileName)
+{
+ ifstream f(fileName);
+
+ if (!f.is_open())
+ return 0;
+
+ f.seekg(0, ios::end);
+ size_t pos = f.tellg();
+
+ f.close();
+
+ return pos;
+}
+int main()
+{
+
+
+ cout << getFileSize("sizeFile.cpp") << endl;
+
+ return 0;
+} \ No newline at end of file