Я пытался около 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 «, но это правильно выводит последнюю строку и выдает консоль с ошибкой …
Я поиграю с этим еще немного … Если у кого-нибудь из вас есть идея, дайте мне знать. Я обновлю здесь, если я выясню это …
Я пытался решить вашу проблему на моем компьютере.
Я сделал то, что изменил перебрать текущую строку и вставить ее в массив 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+
++++++
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 Предполагая, что строки не начинаются с пробелов, в противном случае используйте игнорировать () функция-член.