From 59508931bc42064c23d5fbcb062d6f7396a873ab Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 30 Mar 2022 20:20:32 +0300 Subject: Solved dimitriev hw (sem 3, ex4) --- .../Solutions Sem. 03/ex4/File.cpp | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp (limited to 'Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp') diff --git a/Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp b/Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp new file mode 100644 index 0000000..f553bbe --- /dev/null +++ b/Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp @@ -0,0 +1,102 @@ +#include "File.h" + +/* Helper functions */ + +size_t fileSize(std::ifstream& file) { + int currIndex = file.tellg(); + file.seekg(0, std::ios::end); + + size_t size = file.tellg(); + file.seekg(currIndex, std::ios::beg); + + return size; +} + +/* Private File functions */ + +void File::resizeBuffer() { + size_t newLen = (length == 0) ? 8 : length << 1; + + Bytex* temp = new Bytex[newLen]; + for (int i = 0; i < length; i++) + temp[i] = fileBuffer[i]; + + if (length != 0) delete[] fileBuffer; + fileBuffer = temp; + length = newLen; +} + +char File::bytexToReadableChar(Bytex bytex) const { + char b = bytex.getByte(); + if ((b >= 'A' && b <= 'Z') || (b >= 'a' && b <= 'z')) + return bytex.getByte(); + return '.'; +} + +/* Public File functions */ + +File::File(const char* filePath) { + std::ifstream inFile(filePath); + if (!inFile.is_open()) { + std::cout << "Error opening file" << std::endl; + return; + } + + size_t size = fileSize(inFile); + length = count = 0; + + for (int i = 0; i < size; i++) + add(inFile.get()); + + inFile.close(); + + size_t pathLen = strlen(filePath) + 1; + originalFilePath = new char[pathLen]; + for (int i = 0; i < pathLen; i++) + originalFilePath[i] = filePath[i]; +} + +File::~File() { + delete[] fileBuffer; + delete[] originalFilePath; +} + +void File::viewFile() const { + char buffer[2]; + + for (size_t i = 0; i < count; i++) { + fileBuffer[i].getHex(buffer); + std::cout << buffer << " "; + } + std::cout << std::endl; + + for (size_t i = 0; i < count; i++) + std::cout << bytexToReadableChar(fileBuffer[i]) << " "; + std::cout << std::endl; +} + +void File::change(int index, Bytex bytex) { + fileBuffer[index] = bytex; +} + +void File::add(Bytex bytex) { + if (count == length) + resizeBuffer(); + + fileBuffer[count++] = bytex; +} + +void File::remove() { + fileBuffer[count--] = '\0'; +} + +void File::save() const { + saveAs(originalFilePath); +} + +void File::saveAs(const char* filePath) const { + std::ofstream outFile(filePath); + for (int i = 0; i < count; i++) + outFile.put(fileBuffer[i].getByte()); + outFile.close(); +} -- cgit v1.3.1-23-gd82d