Как прочитать лабиринт из txt файла и поместить его в 2D массив
Я только что запустил небольшой проект, который читает файл txt следующим образом:
4
XSXX
X X
XX X
XXFX
Итак, мой вопрос заключается в том, как прочитать это и поместить лабиринт в 2D-массив символов в C++. Я пытался использовать "getline", но я просто усложняю свой код. Знаете ли вы, есть ли простой способ решить эту проблему ?
char temp;
string line;
int counter = 0;
bool isOpened=false;
int size=0;
ifstream input(inputFile);//can read any file any name
// i will get it from user
if(input.is_open()){
if(!isOpened){
getline(input, line);//iterater over every line
size= atoi(line.c_str());//atoi: char to integer method.this is to generate the size of the matrix from the first line
}
isOpened = true;
char arr2[size][size];
while (getline(input, line))//while there are lines
{
for (int i = 0; i < size; i++)
{
arr2[counter][i]=line[i];//decides which character is declared
}
counter++;
}
1 ответ:
Ваша ошибка связана с тем, что вы пытаетесь объявить массив с размером, который является непостоянным выражением.
В вашем случае
size
, представляющее число элементов в массиве, должно быть постоянным выражением, так как массивы являются блоками статической памяти, размер которых должен быть определен во время компиляции, перед запуском программы.Чтобы решить ее, вы можете либо оставить массив с пустыми скобками, и размер будет автоматически выведен количество элементов, которые вы размещаете в нем или вы можете использовать
std::string
иstd::vector
, а затем для чтения файла.txt
написать что-то вроде:Как вы можете видеть, этот вектор уже является "своего рода" двумерным массивом// open the input file ifstream input(inputFile); // check if stream successfully attached if (!input) cerr << "Can't open input file\n"; string line; int size = 0; // read first line getline(input, line); stringstream ss(line); ss >> size; vector<string> labyrinth; // reserve capacity labyrinth.reserve(size); // read file line by line for (size_t i = 0; i < size; ++i) { // read a line getline(input, line); // store in the vector labyrinth.push_back(line); } // check if every character is S or F // traverse all the lines for (size_t i = 0; i < labyrinth.size(); ++i) { // traverse each character of every line for (size_t j = 0; j < labyrinth[i].size(); ++j) { // check if F or S if (labyrinth[i][j] == 'F' || labyrinth[i][j] == 'S') { // labyrinth[i][j] is F or S } if (labyrinth[i][j] != 'F' || labyrinth[i][j] != 'S') { // at least one char is not F or S } } }
char
только с большим количеством дополнительных средств, которые позволяют выполнять множество операций над его содержимым.