From 8f162cde46a34d04e3a8a655067ee5174258e249 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 28 Mar 2026 16:20:14 +0200 Subject: feat(Week06): Add solutions --- Week06/Exercise04.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Week06/Exercise04.cpp (limited to 'Week06/Exercise04.cpp') diff --git a/Week06/Exercise04.cpp b/Week06/Exercise04.cpp new file mode 100644 index 0000000..004dacc --- /dev/null +++ b/Week06/Exercise04.cpp @@ -0,0 +1,52 @@ +#include +#include + +void printFileBetweenPositions(std::ifstream& inFile, int start, int end) { + if (start >= end) + return; + + int original = inFile.tellg(); + inFile.seekg(start, std::ios::beg); + + while (inFile.tellg() <= end) { + std::cout.put(inFile.get()); + } + + inFile.seekg(original, std::ios::beg); +} + +int main() { + // Във файловите системи, имената на файлове са с ограничена дължина, + // така че и ние да работим с ограничена дължина е коректно + char fileName[1024]; + std::cin.getline(fileName, sizeof(fileName) / sizeof(*fileName)); + + std::ifstream inFile(fileName); + + if (!inFile.is_open()) { + std::cout << "Couldn't open file!" << std::endl; + } + else { + int beg = inFile.tellg(); + + // seekg(0, std::ios::end) ще ни заведе в края на файла, + // след последния байт, все едно сме отишли при терминиращата + // нула в низ. Затова трябва да отидем с една позиция назад, + // за да стигнем последния (съществуващ) байт във файла. + inFile.seekg(-1, std::ios::end); + int endOfLine = inFile.tellg(); + + while (inFile.tellg() != beg) { + if (inFile.peek() == '\n') { + printFileBetweenPositions(inFile, (int)inFile.tellg() + 1, endOfLine); + endOfLine = inFile.tellg(); + } + inFile.seekg(-1, std::ios::cur); + } + + printFileBetweenPositions(inFile, inFile.tellg(), endOfLine); + std::cout.flush(); + } + + return 0; +} -- cgit v1.3.1-23-gd82d