1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #include <fstream>
- #include <iostream>
- #include "Reader.h"
- const std::string& Reader::getName(int id) {
- return names[id];
- }
- const std::vector<int>& Reader::operator[](int x) const {
- return distances[x];
- }
- int Reader::getOrAddId(const std::string& s) {
- auto found = nameToId.find(s);
- if(found != nameToId.end()) {
- return found->second;
- }
- int id = ids++;
- nameToId[s] = id;
- for(std::vector<int>& inner : distances) {
- inner.push_back(-1);
- }
- distances.push_back(std::vector<int>(ids, -1));
- distances.back()[ids - 1] = 0;
- names.push_back(s);
- return id;
- }
- std::string Reader::trim(const std::string& s) const {
- size_t start = 0;
- while(start < s.length() && s[start] == ' ') {
- start++;
- }
- size_t end = s.length();
- while(end > 0 && s[end - 1] == ' ') {
- end--;
- }
- return s.substr(start, end - start);
- }
- bool Reader::read(const char* path) {
- std::ifstream in;
- in.open(path);
- if(!in.good()) {
- std::cout << "cannot find data\n";
- return true;
- }
- while(!in.eof()) {
- std::string s;
- std::getline(in, s);
- if(s.find("road(", 0) != 0) {
- continue;
- }
- s = s.substr(5, s.length() - 5);
- size_t fromIndex = s.find(",", 0);
- if(fromIndex == s.npos) {
- continue;
- }
- size_t toIndex = s.find(",", fromIndex + 1);
- if(toIndex == s.npos) {
- continue;
- }
- size_t distanceIndex = s.find(")", toIndex + 1);
- if(distanceIndex == s.npos) {
- continue;
- }
- std::string from = trim(s.substr(0, fromIndex));
- std::string to = trim(s.substr(fromIndex + 1, toIndex - fromIndex - 1));
- std::string distanceString =
- trim(s.substr(toIndex + 1, distanceIndex - toIndex - 1));
- int fromId = getOrAddId(from);
- int toId = getOrAddId(to);
- int distance = std::stoi(distanceString);
- distances[fromId][toId] = distance;
- distances[toId][fromId] = distance;
- }
- return false;
- }
- void Reader::print() const {
- for(size_t x = 0; x < distances.size(); x++) {
- for(size_t y = 0; y < distances[x].size(); y++) {
- printf("%3d ", distances[x][y]);
- }
- std::cout << "\n";
- }
- }
|