尝试将文本文件(ifstream)转换为 C++ 中的二维字符数组

Trying to convert a text file (ifstream) into a 2D array of chars in c++

我已经尝试了大约 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(我说的那个可以正常工作)。使第二个代码上的字符显示为普通字符!问题是 - 他们现在看起来像这样:

++++++

+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" 但是正确打印出最后一行并使控制台崩溃并出现错误... 我会再玩这个......如果你们有任何想法,请告诉我。如果我弄明白了,我会在这里更新...

第一次尝试

inputMap >> MapSymbols;

运算符 >> 忽略所有白色字符,包括空格。

第二次和第三次尝试

inputMap.get(MapSymbols);

使用正确的函数来考虑空格,但是你忘记了当你获得一个换行符时'\n',你不能等待下一次迭代来读取(好的)下一个字符。您可能还会遇到 '\r',具体取决于 OS。

一个解决方案

您可以使用 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假设行不以空格开头,否则使用ignore()成员函数。

我试图在我的电脑上解决你的问题。

我所做的更改是我迭代当前行并将其插入数组一个字符一个字符。

此代码运行良好:

#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+
++++++