diff options
Diffstat (limited to 'week09/Exercise3')
| -rw-r--r-- | week09/Exercise3/Train.cpp | 26 | ||||
| -rw-r--r-- | week09/Exercise3/Train.h | 2 | ||||
| -rw-r--r-- | week09/Exercise3/TrainNetwork.cpp | 15 | ||||
| -rw-r--r-- | week09/Exercise3/TrainNetwork.h | 1 | ||||
| -rw-r--r-- | week09/Exercise3/main.cpp | 75 |
5 files changed, 109 insertions, 10 deletions
diff --git a/week09/Exercise3/Train.cpp b/week09/Exercise3/Train.cpp index 68d4206..4dd793e 100644 --- a/week09/Exercise3/Train.cpp +++ b/week09/Exercise3/Train.cpp @@ -49,18 +49,37 @@ Train::Train(Train&& other) { other.currentRegion = nullptr; } +Train& Train::operator=(Train&& other) { + if (this != &other) { + free(); + + strcpy(this->model, other.model); + this->railID = other.railID; + + this->regionsFileName = other.regionsFileName; + other.regionsFileName = nullptr; + this->currentRegion = other.currentRegion; + other.currentRegion = nullptr; + } + return *this; +} + void Train::setCurrentRegion(std::ifstream& inFile) { int start = inFile.tellg(); while (!inFile.eof() && inFile.peek() != '\n') { inFile.get(); } - inFile.clear(); + if (inFile.eof()) { + inFile.clear(); + inFile.seekg(0, std::ios::end); + } int length = inFile.tellg(); this->currentRegion = new char[length + 1]; inFile.seekg(start, std::ios::beg); - inFile.getline(this->currentRegion, length + 1); + inFile.getline(this->currentRegion, length); + this->currentRegion[length] = '\0'; } Train::Train(const char model[128], unsigned railID, const char* regionsFileName) { @@ -108,7 +127,8 @@ void Train::TransferNextRegion() { throw "Couldn't open regions file!"; } - while (!fileStringEq(inFile, currentRegion)); + while (!fileStringEq(inFile, currentRegion)) { + } setCurrentRegion(inFile); inFile.close(); diff --git a/week09/Exercise3/Train.h b/week09/Exercise3/Train.h index 6b90477..7170d01 100644 --- a/week09/Exercise3/Train.h +++ b/week09/Exercise3/Train.h @@ -20,7 +20,7 @@ public: Train(Train&& other); Train& operator=(Train&& other); - Train(const char model[127], unsigned railID, const char* regionsFileName); + Train(const char model[128], unsigned railID, const char* regionsFileName); void TransferNextRegion(); void SwitchRailLine(unsigned railID, const char* regionsFileName); diff --git a/week09/Exercise3/TrainNetwork.cpp b/week09/Exercise3/TrainNetwork.cpp index cf9b6a9..0e95a7b 100644 --- a/week09/Exercise3/TrainNetwork.cpp +++ b/week09/Exercise3/TrainNetwork.cpp @@ -2,6 +2,14 @@ #include <cstring> #include <fstream> +TrainNetwork::TrainNetwork(const char id[8], Train trains[512]) { + strcpy(this->id, id); + for (int i = 0; i < 512; i++) { + this->trains[i] = trains[i]; + collided[i] = false; + } +} + bool TrainNetwork::HaveCollided(int index1, int index2) { if (trains[index1].railID != trains[index2].railID) { return false; @@ -10,6 +18,9 @@ bool TrainNetwork::HaveCollided(int index1, int index2) { return false; } + // Остава да проверим дали currentRegion е последния ред във файла + + // Допускаме, че за конкретно railID съществува единствен конкретен файл (единствено съдържание) std::ifstream regionFile(trains[index1].regionsFileName); if (!regionFile.is_open()) { throw "Couldn't open region file!"; @@ -31,7 +42,7 @@ bool TrainNetwork::HaveCollided(int index1, int index2) { regionFile.seekg(-1, std::ios::cur); } - bool lastLineEqualsCurrent = (regionFile.tellg() == -1 || regionFile.peek() == '\n') && regionIndex == 0; + bool lastLineEqualsCurrent = (regionFile.fail() || regionFile.peek() == '\n') && regionIndex == 0; regionFile.close(); return !lastLineEqualsCurrent; @@ -46,7 +57,7 @@ int TrainNetwork::RunTrains() { if (collided[i]) continue; for (int j = 0; j < 512; j++) { - if (collided[j] || j == i) continue; + if (j == i) continue; if (HaveCollided(i, j)) { collided[i] = collided[j] = true; diff --git a/week09/Exercise3/TrainNetwork.h b/week09/Exercise3/TrainNetwork.h index 2d40879..ca0296e 100644 --- a/week09/Exercise3/TrainNetwork.h +++ b/week09/Exercise3/TrainNetwork.h @@ -7,6 +7,7 @@ class TrainNetwork { bool collided[512]; public: + TrainNetwork(const char id[8], Train trains[512]); bool HaveCollided(int index1, int index2); int RunTrains(); }; diff --git a/week09/Exercise3/main.cpp b/week09/Exercise3/main.cpp index d9ebd6f..6268406 100644 --- a/week09/Exercise3/main.cpp +++ b/week09/Exercise3/main.cpp @@ -1,8 +1,75 @@ +#include <iostream> +#include <fstream> +#include <cstring> #include "Train.h" +#include "TrainNetwork.h" + +void railidToFilename(unsigned railID, char outputFileName[9]) { + // възползваме се от факта, че най-често int се съставя от четири байта + strncpy(outputFileName, (char*)&railID, sizeof(char)); + strcat(outputFileName, ".txt"); +} + +void splitRails(const char* fileName) { + std::ifstream inFile(fileName, std::ios::binary); + if (!inFile.is_open()) { + throw "Couldn't open file!"; + } + + while (!inFile.eof()) { + unsigned railID; + inFile.read((char*)&railID, sizeof(railID)); + int regionsCount; + inFile.read((char*)®ionsCount, sizeof(regionsCount)); + + char outputFileName[9]; + railidToFilename(railID, outputFileName); + + std::ofstream outFile(outputFileName); + if (!outFile.is_open()) { + throw "Couldn't open file!"; + } + + while (regionsCount > 0) { + char buffer; + inFile.read(&buffer, sizeof(buffer)); + outFile.write(&buffer, sizeof(buffer)); + if (buffer == '\n') { + regionsCount--; + } + } + + outFile.close(); + } + + inFile.close(); +} int main() { - Train t("abc", 1, "train.txt"); - t.TransferNextRegion(); - t.TransferNextRegion(); - t.TransferNextRegion(); + char fileName[1024]; + std::cin.getline(fileName, 1024); + + splitRails(fileName); + + int N; + std::cin >> N; + Train trains[512]; + + char modelBuffer[128]; + unsigned railID; + char filenameBuffer[9]; + for (int i = 0; i < N && i < 512; i++) { + std::cin.ignore(); + std::cin.getline(modelBuffer, 128); + std::cin >> railID; + railidToFilename(railID, filenameBuffer); + trains[i] = Train(modelBuffer, railID, filenameBuffer); + } + + char tnIdBuffer[8]; + std::cin.ignore(); + std::cin.getline(tnIdBuffer, 8); + + TrainNetwork tn(tnIdBuffer, trains); + std::cout << tn.RunTrains() << std::endl; } |
