尝试将文本文件(ifstream)转换为c ++中的二维chars数组

时间:2017-01-29 01:52:23

标签: c++ arrays multidimensional-array ifstream chars

我已经尝试了大约2天,我想我已经接近但仍然没有雪茄! 我有一个看起来像这样的文本文件:

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

如果我尝试正常打印出来,一切正常:

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

    string input;

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

}

但是当我尝试将所有这些符号放入2D数组时,我会在某些形式的代码中获得空格,我尝试过;或者,在我最近的尝试中,似乎最接近我需要的东西,我将奇怪的符号放在正确的位置。我无法弄清楚出了什么问题......

这是我现在正在尝试的代码:

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;
        }
    }


}

这就是控制台告诉我的:

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

btw,MapLayoutArray只是:

char MapLayoutArray[6][6];

RadLexus,我试过不使用&gt;&gt;所以它看起来像这样:

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;
        }
    }


}

那也打印出来:

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

----- ------ UPDATE

在第一个代码上使用.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&lt; = 6”但是正确地打印出最后一行并且崩溃控制台时出错... 我会更多地玩这个...如果你们有任何想法,请告诉我。如果我搞清楚,我会在这里更新......

2 个答案:

答案 0 :(得分:0)

首次尝试

inputMap >> MapSymbols;

运营商&gt;&gt;忽略每个白色字符,包括空格。

第二次和第三次尝试

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

答案 1 :(得分:0)

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

我做的改变是我迭代当前行并通过char将其插入数组 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+
++++++