Reader.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <fstream>
  2. #include <iostream>
  3. #include "Reader.h"
  4. const std::string& Reader::getName(int id) {
  5. return names[id];
  6. }
  7. const std::vector<int>& Reader::operator[](int x) const {
  8. return distances[x];
  9. }
  10. int Reader::getOrAddId(const std::string& s) {
  11. auto found = nameToId.find(s);
  12. if(found != nameToId.end()) {
  13. return found->second;
  14. }
  15. int id = ids++;
  16. nameToId[s] = id;
  17. for(std::vector<int>& inner : distances) {
  18. inner.push_back(-1);
  19. }
  20. distances.push_back(std::vector<int>(ids, -1));
  21. distances.back()[ids - 1] = 0;
  22. names.push_back(s);
  23. return id;
  24. }
  25. std::string Reader::trim(const std::string& s) const {
  26. size_t start = 0;
  27. while(start < s.length() && s[start] == ' ') {
  28. start++;
  29. }
  30. size_t end = s.length();
  31. while(end > 0 && s[end - 1] == ' ') {
  32. end--;
  33. }
  34. return s.substr(start, end - start);
  35. }
  36. bool Reader::read(const char* path) {
  37. std::ifstream in;
  38. in.open(path);
  39. if(!in.good()) {
  40. std::cout << "cannot find data\n";
  41. return true;
  42. }
  43. while(!in.eof()) {
  44. std::string s;
  45. std::getline(in, s);
  46. if(s.find("road(", 0) != 0) {
  47. continue;
  48. }
  49. s = s.substr(5, s.length() - 5);
  50. size_t fromIndex = s.find(",", 0);
  51. if(fromIndex == s.npos) {
  52. continue;
  53. }
  54. size_t toIndex = s.find(",", fromIndex + 1);
  55. if(toIndex == s.npos) {
  56. continue;
  57. }
  58. size_t distanceIndex = s.find(")", toIndex + 1);
  59. if(distanceIndex == s.npos) {
  60. continue;
  61. }
  62. std::string from = trim(s.substr(0, fromIndex));
  63. std::string to = trim(s.substr(fromIndex + 1, toIndex - fromIndex - 1));
  64. std::string distanceString =
  65. trim(s.substr(toIndex + 1, distanceIndex - toIndex - 1));
  66. int fromId = getOrAddId(from);
  67. int toId = getOrAddId(to);
  68. int distance = std::stoi(distanceString);
  69. distances[fromId][toId] = distance;
  70. distances[toId][fromId] = distance;
  71. }
  72. return false;
  73. }
  74. void Reader::print() const {
  75. for(size_t x = 0; x < distances.size(); x++) {
  76. for(size_t y = 0; y < distances[x].size(); y++) {
  77. printf("%3d ", distances[x][y]);
  78. }
  79. std::cout << "\n";
  80. }
  81. }