如何从文本文件中读取矩阵并将其存储到2D数组中?

时间:2015-10-29 13:22:50

标签: c++ arrays file text multidimensional-array

我是初学者。我正在尝试读取文件并将其放入2D数组中。这是我的代码。在输出文件后,它会在内存中显示垃圾,循环永远不会结束,除非它达到50。

include "stdafx.h"
#include <iostream> 
#include <fstream>  
using namespace std;

void main()
{
    char arr[50][50];
    ifstream fin;
    fin.open("Map.txt");

    for (int i = 0; i < 50; i++)
    {

        for ( j = 0; j < 50; j++)
        {
            fin.get(arr[i][j]);
        }


    }
    for (int i = 0; arr[i]!=NULL; i++)
    {
        for (int j = 0; arr[j]!=NULL; j++)
        {
            cout<< arr[i][j];
        }
    }



}

文本文件如下所示

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@                                        @@
@@                                        @@ 
@@                                        @@
@@                 ^                      @@ 
@@                                        @@
@@                                        @@
@@                                        @@  
@@@@@@@@@@@@@@@@                          @@
              @@                          @@
@@@@@@@@@@@@@@@@                          @@
@@                                        @@
@@  x x                                   @@
@@                                        @@
@@                                  o     @@
@@                                        @@
@@                        o               @@
@@                                        @@ 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

3 个答案:

答案 0 :(得分:2)

我觉得这样的作品

#include <iostream>
#include <fstream>

int main() {

const int nSize = 50;
//-- initialize array with 0 --
char map[nSize][nSize] = { {0} };

std::ifstream in;
in.open("input.txt");

int i = 0, j = 0;
while (!in.eof()) {
    char next = in.get();
    if (next != '\n')
        map[i][j++] = next;
    else {
        j = 0;
        i++;
    }
}

int rowsCount = i + 1;
for (i = 0; i < rowsCount; i++) {
    j = 0;
    while (map[i][j] != 0) 
        std::cout << map[i][j++];
    std::cout << std::endl;
}


return 0;
}

所有文本行以“结束符号”'\ n'或'\ r \ n'结尾。这可以表示在阵列中转到新的字符行。 由于数组初始化为0,我们可以将它用作输出行结束的标志,但更好的是在读取数据时计算数组的大小(如果所有行都具有相同的大小)。

答案 1 :(得分:0)

试试这个,但确保 Map.txt 中的输入矩阵肯定是50 * 50个字符,否则您可能会收到不确定的结果。 (include "stdafx.h"缺失,因为我使用的是g ++而不是MS Visual Studio,但如果按照VS需要的方式创建项目,则可以为预编译的头添加此包含)

#include <iostream> 
#include <fstream>
#include <string>
using namespace std;

const unsigned int HEIGHT = 50;
const unsigned int WIDTH = 50;

int main()
{
    char arr[HEIGHT][WIDTH];

    ifstream fin;
    fin.open("Map.txt");
    string line;

    //let's assume here the proper size of input Map
    for(unsigned int i = 0; i < HEIGHT; i++)
    {
      getline(fin, line);
      for(unsigned int j = 0; j < WIDTH; j++)
      {
        arr[i][j] = line[j];
      }
    }

    //let's assume here the proper size of input Map
    for (int i = 0; i < HEIGHT; i++)
    {
        for ( int j = 0; j < WIDTH; j++)
        {
            cout << (char)arr[i][j];
        }
        cout << endl;
    }
}

答案 2 :(得分:-1)

如果你想做我认为你的事,试试这个:

include "stdafx.h"
include <iostream> 
include <fstream>  
using namespace std;



   void main()
{
    char arr[50][50];
    ifstream fin;
    fin.open("Map.txt");

    for (int i = 0; i < 50; i++)
    {

        for ( int j = 0; j < 50; j++)
        {
            fin.get(arr[i][j]);
        }


    }
    for (int i = 0; arr[i]!=NULL; i++)
    {
        for (int j = 0; arr[j]!=NULL; j++)
        {
            cout<< arr[i][j];
        }
    }



}

文本文件中的数据是:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@                                        @@
@@                                        @@ 
@@                                        @@
@@                 ^                      @@ 
@@                                        @@
@@                                        @@
@@                                        @@  
@@@@@@@@@@@@@@@@                          @@
              @@                          @@
@@@@@@@@@@@@@@@@                          @@
@@                                        @@
@@  x x                                   @@
@@                                        @@
@@                                  o     @@
@@                                        @@
@@                        o               @@
@@                                        @@ 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@