aboutsummaryrefslogtreecommitdiff
path: root/week09/Exam1/main.cpp
blob: 1d6205156a1f3ffd74770f0fa7adf4243a5e2112 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "DroneShow.h"
#include <iostream>
#include <fstream>

/* Относно условието с dronesPath.txt, напълно валидна интерпретация е, че просто
 * пренасяме информация от файл на име dronesPath.txt в друг с име, въведено от потребителя.
 * Друга интерпретация е, че пътищата трябва да се изкарат в различни файлове за всеки дрон, или пък
 * да разширим Drone класа, така че да работи с такъв файл или с директен обект който пази пътя.
 *
 * Всички тези са валидни, ако се зачетете в условието, нищо което е директно казано не противоречи,
 * на вас остава да решите кое искате да имплементирайте.
 * На мен ми се струва, че първото изисква възможно най-малко труд, така че това съм направил.
 */
void dronesPathLogic() {
	std::ifstream inFile("dronesPath.txt");
	if (!inFile.is_open()) return;

	char outName[1024];
	std::cin.getline(outName, 1024);

	std::ofstream outFile(outName, std::ios::binary);
	if (!outFile.is_open()) return;

	while(!inFile.eof()) { // за всеки път в dronesPath.txt
		int currentSize = 0;

		// Намираме дължината на сегашния път
		// Възможно е да го напрваим с оразмеряващ се масив в който пълним всички координати, но това ми се струва повече писане
		int startPos = inFile.peek();
		while (inFile.peek() != '\n' && !inFile.eof()) { // докато не сме стигнали края на пътя
			currentSize++;
			double x, y;
			inFile >> x >> y; // "пропускаме" сегашния координат
		}
		inFile.clear(); // Ако сме стигнали края на файла, fail флагът ще бъде вдигнат, така го сваляме
		inFile.seekg(startPos, std::ios::beg); // Намерили сме дължината, но сега ще трябва да изкараме всички координати

		// Не е казано как трябва да изглежда файла в който пишем, затова правим най-простото нещо:
		// първо пишем дължината на пътя (брой координати) и след това толкова на брой координати
		// Имайки предвид, че е двоичен, не можем да имаме разделител ей-така, за да определим кога
		// един път почва и друг свършва.
		outFile.write((char*)&currentSize, sizeof(currentSize));

		while (inFile.peek() != '\n' && !inFile.eof()) {
			double x, y;
			inFile >> x >> y;
			outFile.write((char*)&x, sizeof(x));
			outFile.write((char*)&y, sizeof(y));
		}
	}

	inFile.close();
	outFile.close();
}

int main() {
	char bufferName[1024], bufferGeneratedPath[1024];
	Drone* drones[1024];

	for (int i = 0; i < 1024; i++) {
		std::cin.getline(bufferName, 1024);
		std::cin.getline(bufferGeneratedPath, 1024);
		int position;
		std::cin >> position;
		std::cin.ignore();

		drones[i] = new Drone(bufferName, bufferGeneratedPath, position);
	}

	dronesPathLogic();

	std::cin.getline(bufferName, 1024);
	DroneShow ds(bufferName, drones);
	ds.play();

	for(int i = 0; i < 1024; i++) {
		delete drones[i];
	}
}