Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Object-oriented Programming / Solutions Sem. 03 / ex4 / File.cpp
diff options
context:
space:
mode:
1 files changed, 102 insertions, 0 deletions
-rw-r--r--Year 1/Object-oriented Programming/Solutions Sem. 03/ex4/File.cpp102
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();
+}