2013-12-09 2 views
-1

Я пытаюсь присвоить значения 2d массив из текстовых файлов, это то, что у меня есть:Наполнение 2d массив из последовательного файла

string line = ""; 
string temp = ""; 

string removechr = "{} "; 
string sepchar = ","; 

ifstream myfile("pt.txt", ios::in); 

if(myfile.is_open()){ 
    while(getline(myfile,line)){ 
     //--Remove characters 
     size_t found = line.find_first_of(removechr); 
     while(found != string::npos){ 
      line.erase(found); 
     } 
     //--Assign Values 
     for(int y = 0; y < YCOL; ++y){ 
      for(int x = 0; x < XROW; ++x){ 
       size_t found = line.find_first_of(sepchar); 
       while(found != string::npos){ 
         temp.insert(line.begin(),found); 
         map[y][x]=stoi(temp); 
         temp = ""; 
         line.erase(line.begin(),(line.begin() + found) - 1) ; 
       } 
      } 
     }//End of for loop 
    } 
} 

Сначала я удалить ненужные символы ({} и пробел) , затем после этого я запускаю цикл для установки значений в массиве. Итак, теперь, когда он находит первую запятую, я хочу вставить значение в строку temp, поэтому ее можно назначить массиву. После всего этого я удалил только что назначенную часть.

Это то, что я хочу сделать, но я, похоже, не работаю, я надеюсь, что есть лучший способ сделать это.

+0

_'but, я, похоже, не работает, слишком смутно задавать вопрос здесь ... –

ответ

0

Кажется, ваш вопрос заключается не в том, чтобы открыть файл и иметь дело с потенциальными ошибками. Таким образом, это концентрируется на фактической петле. Вы не совсем определили формат своего файла, но, похоже, вы получаете что-то, что содержит завитки и отдельные целые числа через запятую. Неясно, находится ли каждая строка в своей строке или если она может быть разделена на несколько строк (если последняя, ​​я бы прочитал весь файл, сделаю преобразования ниже и распределяю результат тогда). Я предполагаю, что каждая строка находится на отдельной строке:

std::string line; 
for (int row(0); row != rows; ++row) { 
    if (!std::getline(myfile, line)) { 
     std::cout << "failed to read all rows!\n"; 
     return false; 
    } 
    // remove curlies; spaces don't matter 
    line.erase(std::remove_if(line.begin(), line.end(), 
           [](char c){ return c == '{' || c == '}'; })); 
    std::replace(line.begin(), line.end(), ',', ' '); 
    std::istringstream in(line); 
    for (int col(0); col != cols; ++col) { 
     if (!(in >> map[row][col]) { 
      std::cout << "failed to read all columns in row " << row << "\n"; 
      return false; 
     } 
    } 
} 

код сначала удаляет мусор из линий, а затем заменяет запятые пробелов, как это аккуратные сепараторы для целых чисел в любом случае, а затем просто читает клетку.

Смежные вопросы