2014-10-31 10 views
-2

В настоящее время я программирую программу, используя алгоритм a-star. Поэтому я генерирую случайный лабиринт и сохраняю его в .txt-файле. Файл выглядит как это:Считать целые числа в файле и скопировать в динамический массив

19999999199999991 
19191119111919191 

где 1 является стеной, и 9 это пустое пространство.

Теперь я должен прочитать файл в программе поиска , которая берет файл и считывает его в массив. Затем программа вычисляет кратчайший путь.

Когда я просто копирую целые числа файла в исходный код, все работает нормально. Но теперь я хочу сделать программу более динамичной, поэтому; Я хотел бы прочитать в файле, вычислить необходимый размер массива и сразу сохранить целые числа в массиве.

Моя большая проблема теперь в том, что я не знаю, как читать в файле и получить размер лабиринта.

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

Я уже знаю, как открыть файл, но;

  • Как получить размер файла (число целых чисел в строке и количество строк) и;
  • Как я могу хранить целые числа отдельно в массиве?

Edit:

Так что я обновил свою программу со следующим кодом:

main 
{ 
    ifstream myfile("BLOCK_style_maze.txt"); 
    string line; 
    int colCount=0; 
    int rowCount=0; 
    int temp=0; 

    if(myfile.is_open()) 
    { 
     if(getline(myfile,line)) 
     { 
      rowCount++; 
      int i=0; 
      for(i=0;i<line.length();i++) 
      { 
       if(line.at(i)=='1' || line.at(i)=='9') colCount++; 
      } 
     } 
     while(getline(myfile, line)) 
     { 
      rowCount++; 
     } 
     cout << "R:"<< rowCount << "C:" << colCount << endl; 
     myfile.close(); 
    } 
    else 
    { 
     cout << "Unabale to open maze file"; 
    } 

    MAP_WIDTH = colCount; 
    MAP_HEIGHT = rowCount; 

    map=new int [MAP_WIDTH*MAP_HEIGHT]; 
    int k=MAP_WIDTH*MAP_HEIGHT; 
    int j=0; 

    if (myfile.is_open()) 
    { 
     while(myfile >> temp) 
     { 
      map[j++] = temp; 
     } 
    } 

    for(int i=0; i<=k; i++) 
    { 
     cout << map[i]<< endl; 
    } 
} 

Чтобы проверить код, который я хотел напечатать элементы матрицы отображения на консоли, но Я просто получаю 0 как выход. Поэтому я немного смущен тем, что делаю неправильно.

+1

станд :: вектор ваш жареное. Вам не нужно рассказывать ему размер ничего, и это просто ... работает: D – SlySherZ

ответ

0

Комбинация std::vector и ее функция push_back сделали бы трюк. Не нужно прекомпретировать размер лабиринта.

Поскольку вы, похоже, не знакомы с std::vector Я настоятельно рекомендую выполнить упражнение самостоятельно. Тем не менее, я положил here один (из многих) решений, которые широко используют STL, включая std::stringstream, std::copy, std::back_inserter и std::getline. Я также показываю, как получить число строк и столбцов. Обратите внимание, что я также использую функцию C++ 11, например, для диапазона и auto.

+0

Моя проблема в том, что мне нужны MAP_Width и MAP_Height для будущих вычислений. Поэтому мне нужно вычислить эти две переменные.И можете ли вы рассказать мне diverenc между массивом и std :: vector. Я использую код, который мне нужен, чтобы решить лабиринт и просто приспособить его к моим потребностям. Мне не разрешено сильно изменять код. Вот почему я специально прошу массив. – user3794592

+2

@ user3794592: вам не нужно знать ширину и высоту перед чтением файла карты, не так ли? Таким образом, вы можете просто получить размеры векторов после прочтения файла. –

+0

@ user3794592, христианин сказал это очень хорошо: используйте функцию 'std :: vector :: size' member, чтобы получить количество строк и столбцов. – Hiura

-1

Это не очень сложная задача, попробовать что-то вроде следующего кода:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    ifstream myfile ("example.txt"); 
    int colCount = 0; 
    int rowCount = 0; 
    if (myfile.is_open()) 
    { 
    if (getline(myfile,line)) //Read the first line to get the number of columns 
    { 
     rowCount++; //make sure we count the first line as a row 
     int i = 0; 
     for (i=0;i<line.length();i++) 
     { 
     if (line.at(i) == '1' or line.at(i) == '9') colCount++; //each 1 or 9 means a column, we want to ignore other characters like '\n' or spaces 
     } 
    } 
    while (getline(myfile,line)) //Read the rest of the lines to get the rest of the rows. 
    { 
     rowCount++; 
    } 
    myfile.close(); 
    } 
    cout << "rows=" << rowCount << '\n'; 
    cout << "cols=" << colCount << '\n'; 
    // now that we've counted, let's define our arrays and reopen the file. 
    char** map = new char*[rowCount]; 
    for(int i = 0; i < rowCount; ++i) 
    { 
    map[i] = new char[colCount]; 
    } 

    int currentRow = 0; 
    ifstream myfile2 ("example.txt"); 
    if (myfile2.is_open()) 
    { 
    while(getline(myfile2,line)) 
    { 
     for (int i=0;i<colCount;i++) 
     { 
     map[currentRow][i] = line.at(i); 
     } 
     currentRow++; 
    } 
    } 

    // you can now access this array as a 2d array. point = map[row][column] 
    for(int i=0;i<colCount;i++){ 
    cout << map[0][i]; //Print the first row! 
    } 
    cout << '\n'; 

    return 0; 
} 
+0

Где вы храните информацию о лабиринте? Не обращайте внимания на количество строк и столбцов - вам нужно поставить все свои 1 и 9 местами, и как только вы это сделаете, определение размера лабиринта тривиально. –

+0

Я ударил, прежде чем закончил. Я открываю файл второй раз после того, как я выделил 2D-массив. Я понимаю, что векторы - это, безусловно, «правильный» способ сделать это, но динамическое распределение массивов является очень важной концепцией для низкоуровневого программирования, а также непосредственно отвечает на его вопрос, а не на стандартном «вы делаете это неправильно», ответ. – Optox

+0

Ваш код не компилируется и, самое главное, он течет. – Hiura

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