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*)¤tSize, 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];
}
}
|