aboutsummaryrefslogtreecommitdiff
path: root/week09/Exercise3
diff options
context:
space:
mode:
Diffstat (limited to 'week09/Exercise3')
-rw-r--r--week09/Exercise3/Train.cpp26
-rw-r--r--week09/Exercise3/Train.h2
-rw-r--r--week09/Exercise3/TrainNetwork.cpp15
-rw-r--r--week09/Exercise3/TrainNetwork.h1
-rw-r--r--week09/Exercise3/main.cpp75
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*)&regionsCount, 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;
}