【问题标题】:Trying to convert a text file (ifstream) into a 2D array of chars in c++尝试将文本文件(ifstream)转换为 C++ 中的二维字符数组
【发布时间】:2017-01-29 01:52:22
【问题描述】:

我已经尝试了大约 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;
        }
    }


}

这就是控制台向我显示的内容:

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

顺便说一句,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

【问题讨论】:

  • 看起来您正在存储指针,而不是读取的实际字符。再次提醒我,&gt;&gt; 是否应该在 char 上工作?
  • 您遗漏了关键信息 - 特别是 MapLayoutArray 是什么?无论如何,请尝试提供一个小而完整的代码示例(在某种意义上,其他人可以用它复制您的问题)。像您一样遗漏细节会大大增加遗漏与您的问题实际相关的信息的可能性。
  • 对不起,地图布局数组只是 - char MapLayoutArray[6][6];我将在其中添加...除此之外,这是与此相关的全部代码... Rad Lexus 我还添加了关于您在原始问题中所说的内容的评论,而不是使用>>没有修复它...
  • 文件的编码可能有问题。如果是 ANSI 编码,则使用 inputMap.get 的代码应该可以工作。
  • 我只是确保使用 ANSI 编码保存它,但问题仍然存在...更新 - 修复了奇怪的字母,现在有不同的问题。在原始问题的底部更新...

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


【解决方案1】:

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

我所做的更改是我迭代当前行并将其插入到数组中 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+
++++++

【讨论】:

  • 感谢朋友,工作就像一个魅力!您认为按照我最初计划的方式进行操作可能是不可能的吗?使用字符而不是字符串?并不是说我使用字符串有问题,但现在我很想找到一种使用字符的方法。哦,顺便说一句,我尝试阅读 size_t 和普通 unsigned int 之间的区别,但无法弄清楚。有没有机会赐教一下?
  • @Mr.Trainee 我在下面编辑了我的答案,向您展示了一个解决方案。关于std::size_t,你看过documentation吗?
【解决方案2】:

第一次尝试

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 2022-07-12
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2015-11-21
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多