Как генерировать матрицу <string, int> матрицы из файла данных

0

У меня есть.dat файл и вы хотите получить от него карту

   A  C  D  E  F  G  H  I  K  L  M  N  P  Q  R  S  T  V  W  Y
A  4  0 -2 -1 -2  0 -2 -1 -1 -1 -1 -2 -1 -1 -1  1  0  0 -3 -2
C  0  9 -3 -4 -2 -3 -3 -1 -3 -1 -1 -3 -3 -3 -3 -1 -1 -1 -2 -2
D -2 -3  6  2 -3 -1 -1 -3 -1 -4 -3  1 -1  0 -2  0 -1 -3 -4 -3
E -1 -4  2  5 -3 -2  0 -3  1 -3 -2  0 -1  2  0  0 -1 -2 -3 -2
F -2 -2 -3 -3  6 -3 -1  0 -3  0  0 -3 -4 -3 -3 -2 -2 -1  1  3
G  0 -3 -1 -2 -3  6 -2 -4 -2 -4 -3  0 -2 -2 -2  0 -2 -3 -2 -3
H -2 -3 -1  0 -1 -2  8 -3 -1 -3 -2  1 -2  0  0 -1 -2 -3 -2  2
I -1 -1 -3 -3  0 -4 -3  4 -3  2  1 -3 -3 -3 -3 -2 -1  3 -3 -1
K -1 -3 -1  1 -3 -2 -1 -3  5 -2 -1  0 -1  1  2  0 -1 -2 -3 -2
L -1 -1 -4 -3  0 -4 -3  2 -2  4  2 -3 -3 -2 -2 -2 -1  1 -2 -1
M -1 -1 -3 -2  0 -3 -2  1 -1  2  5 -2 -2  0 -1 -1 -1  1 -1 -1
N -2 -3  1  0 -3  0  1 -3  0 -3 -2  6 -2  0  0  1  0 -3 -4 -2
P -1 -3 -1 -1 -4 -2 -2 -3 -1 -3 -2 -2  7 -1 -2 -1 -1 -2 -4 -3
Q -1 -3  0  2 -3 -2  0 -3  1 -2  0  0 -1  5  1  0 -1 -2 -2 -1
R -1 -3 -2  0 -3 -2  0 -3  2 -2 -1  0 -2  1  5 -1 -1 -3 -3 -2
S  1 -1  0  0 -2  0 -1 -2  0 -2 -1  1 -1  0 -1  4  1 -2 -3 -2
T  0 -1 -1 -1 -2 -2 -2 -1 -1 -1 -1  0 -1 -1 -1  1  5  0 -2 -2
V  0 -1 -3 -2 -1 -3 -3  3 -2  1  1 -3 -2 -2 -3 -2  0  4 -3 -1
W -3 -2 -4 -3  1 -2 -2 -3 -3 -2 -1 -4 -4 -2 -3 -3 -2 -3 11  2
Y -2 -2 -3 -2  3 -3  2 -1 -2 -1 -1 -2 -3 -1 -2 -2 -2 -1  2  7

Однако при заполнении карты у меня возникают проблемы с циклом

static void gen_matrix(map<string, int>& mat)
{
  const string myfile = "myfile.dat";
  vector<string> myChars = { "A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y" };
  ifstream f(myfile);
  string temporal;
  getline(f, temporal); // Ignore first string
  while (getline(f, temporal))
  {
    auto buff(split_string(temporal));
    auto prefix = buff[0];
    size_t i = 1;
   //try 1
   // for(auto it = myChars.begin(), end = myChars.end(); it != end; ++it){
   //      mat[prefix + it] = stoi(buff[i++]);
   // }
   //try 2    
    //for(auto& var = 0; myChars){
    //     mat[prefix + var] = stoi(buff[i++]);
    //}
  }
}

то, что я хотел бы достичь, для каждой функциональности

for each (const auto& var in myChars)
    {
      mat[prefix + var] = stoi(buff[i++]);
    }

Но не было никаких успехов, как изменить цикл?

Теги:
file

2 ответа

1
Лучший ответ

Поскольку вы не показывали свой split_string, и если бы я это правильно понял, вы можете попробовать следующее:

std::vector<std::string> split(const std::string &s) {
    std::stringstream ss(s);
    std::string item;
    std::vector<std::string> elems;
    while (ss >> item) {
        elems.push_back(item);
    }
    return elems;
}


  std::string temporal;
  std::getline(fin, temporal,'\r'); // You may need this carriage return as delim
  std::map<std::string, int> mat;
  std::vector<std::string> buff;

  while(std::getline(f, temporal,'\r'))
  {
    buff = split( temporal) ;
    for(std::size_t x=1; x < buff.size() ; ++x)
        mat[buff[0]+myChars[x-1]] = atoi( buff[x].c_str() );
  }
1

Я предлагаю не читать строки с использованием getline, а использовать операторы ввода-вывода, например:

ifstream f(myfile);
f.ignore( INT_MAX, '\n' );
while (f.good()){
    string prefix;
    f >> prefix;
    for ( const string var : myChars){
        int val;
        f >> val;
        mat[prefix + var] = val;
    }
    f >> ws;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню