diff options
feat(Week06): Add solutions
1 files changed, 52 insertions, 0 deletions
| -rw-r--r-- | Week06/Exercise04.cpp | 52 |
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 <iostream> +#include <fstream> + +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; +} |
