Попытка преобразовать текстовый файл (ifstream) в двумерный массив символов в Stack Overflow

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

++++++
+H   +
+    +
+    +
+   X+
++++++

если я пытаюсь распечатать его нормально, все работает:

void Level::LevelPrinter()  //This prints out fine
{
inputMap.open("Level1.txt");

string input;

while (getline(inputMap, input))
{
cout << input << endl;
}

}

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

Вот код, который я сейчас пробую:

void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");

char MapSymbols;
int Rows, Cols;

{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{

inputMap >> MapSymbols;

MapLayoutArray[Rows][Cols] = MapSymbols;

cout << MapSymbols;
}
cout << endl;
}
}}

И это то, что консоль показывает мне:

╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠

Кстати, MapLayoutArray просто:

char MapLayoutArray[6][6];

RadLexus, я пытался не использовать >>, так что вместо этого это выглядит так:

void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");

char MapSymbols;
int Rows, Cols;

{
for (Rows = 0; Rows < 6; Rows++)
{
for (Cols = 0; Cols < 6; Cols++)
{
inputMap.get(MapSymbols);

MapLayoutArray[Rows][Cols] = MapSymbols;

cout << MapSymbols;
}
cout << endl;
}
}}

Это также распечатывает:

╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠
╠╠╠╠╠╠

——ОБНОВИТЬ——

используя .close для первого кода (тот, который я сказал, работает правильно). Сделано, чтобы символы 2-го кода выглядели как обычные символы! проблема в том, что теперь они выглядят так:

++++++

+H
+
+
+
+
+
+
X+
+

Немного поигрался с кодом и вот этот код:

void Level::LevelPrinterArray()
{
inputMap.open("Level1.txt");

char MapSymbols;

{
for (int Rows = 0; Rows < 6; Rows++)
{
for (int Cols = 0; Cols < 6; Cols++)
{

inputMap.get(MapSymbols);

if (MapSymbols != '\n')
{
MapLayoutArray[Rows][Cols] = MapSymbols;

cout << MapSymbols;
}

else
{
cout << endl;
}
}
}
}

inputMap.close();
cout << endl;
}

вызывает это:

++++++
+H   +
+    +
+    +
+   X+
+
Press any key to continue . . .

Так что я очень близок, но не могу напечатать последнюю строку. Я перепробовал много вещей, чтобы напечатать последнюю строку, например, сделать первый цикл for «Rows <= 6 «, но это правильно выводит последнюю строку и выдает консоль с ошибкой …
Я поиграю с этим еще немного … Если у кого-нибудь из вас есть идея, дайте мне знать. Я обновлю здесь, если я выясню это …

0

Решение

Я пытался решить вашу проблему на моем компьютере.

Я сделал то, что изменил перебрать текущую строку и вставить ее в массив char by char.

этот код работает очень хорошо:

#include <string>
#include <iostream>
#include <fstream>

int main(){

std::ifstream inputMap("C:\\Res\\Level1.txt");

char arr[6][6];
for (int i = 0; i < 6; i++)
{
std::string input;
std::getline(inputMap, input);
for (int k = 0; k < input.length(); k++)
{
arr[i][k] = input[k];
std::cout << input[k];
}
std::cout << std::endl;
}

std::cout << std::endl;

for (size_t l = 0; l < 6; l++)
{
for (size_t m = 0; m < 6; m++)
{
std::cout << arr[l][m];
}
std::cout << std::endl;
}

system("PAUSE");
return 0;

}

Вывод по желанию (я скопировал его здесь).

Для вашей цели, только не печатайте это в первый или второй раз;)

++++++
+H   +
+    +
+    +
+   X+
++++++

++++++
+H   +
+    +
+    +
+   X+
++++++
0

Другие решения

Первая попытка

inputMap >> MapSymbols;

Оператор >> игнорирует все белые символы, включая пробелы.

Вторая и третья попытки

inputMap.get(MapSymbols);

Использование правильной функции для учета пробелов, но вы забываете об этом, когда вы получаете символ новой строки '\n', вы не должны ждать следующей итерации, чтобы прочитать (хороший) следующий символ. Вы также можете столкнуться '\r' в зависимости от ОС.

Решение

Ты можешь использовать std::ws чтобы пропустить эти пробелы в конце каждой строки1:

for (std::size_t Rows = 0; Rows < 6; Rows++)
{
for (std::size_t Cols = 0; Cols < 6; Cols++)
{
char MapSymbols;
inputMap.get(MapSymbols);
MapLayoutArray[Rows][Cols] = MapSymbols;
std::cout << MapSymbols;

}
inputMap >> std::ws; // HERE
std::cout << std::endl;
}

1 Предполагая, что строки не начинаются с пробелов, в противном случае используйте игнорировать () функция-член.

0