【问题标题】:Loading text from a file into a 2-dimensional array (C++)将文件中的文本加载到二维数组中(C++)
【发布时间】:2009-12-09 10:20:05
【问题描述】:

我正在制作一个游戏,我已将地图数据存储在一个大小为 [34][10] 的二维数组中。最初我使用一个简单的函数来填充数组并使用以下代码将这些数据保存到文件中来生成地图:

ofstream myFile;
myFile.open("map.txt");

for ( int y = 0 ; y < MAP_HEIGHT ; ++y )
{
    for ( int x = 0 ; x < MAP_WIDTH ; ++x )
    {
        myFile << m_acMapData[x][y];
    }
    myFile << '\n';
}

myFile.close();

这会输出一个看起来像我想要的样子的文本文件。但是,当我尝试使用以下代码重新读取它时,我会遇到大量访问冲突,并且它在运行时崩溃:

ifstream myFile;
int i=0;
int j=0;
char line[MAP_WIDTH];

myFile.open("map.txt");
while (!myFile.eof())
{
    myFile.getline(line, MAP_WIDTH);
    for ( i=0; i<MAP_WIDTH; i++ )
    {
        m_acMapData[i][j] = line[i];
    }
    ++j;
    cout << line;
}

有谁知道问题出在哪里?

【问题讨论】:

  • 什么是m_acMapData,它是如何声明和初始化的?

标签: c++ file file-io fstream access-violation


【解决方案1】:
while (!myFile.eof())
{
        myFile.getline(line, MAP_WIDTH);

应该是:

while ( myFile.getline(line, MAP_WIDTH) )
{

然而,读入 std::string 会更安全:

string line:
while ( getline( myFile, line ) )
{

您可能还想阅读我关于这个主题的博客,http://punchlet.wordpress.com

【讨论】:

    【解决方案2】:

    是的,我肯定会崩溃,因为你在这里做错了。

    ofstream myFile;
    myFile.open("map.txt");
    
    for ( int y = 0 ; y < MAP_HEIGHT ; ++y ) 
    {
        for ( int x = 0 ; x < MAP_WIDTH ; ++x )
        {
                myFile << m_acMapData[x][y];
        }
        myFile << '\n';
    }
    myFile.close();
    

    假设MAP_HEIGHT = 3MAP_WIDTH = 6 ;

    而且你必须知道 C/C++ 中的数组是行主要的,所以当你尝试访问时

    m_acMapData[4][0] 它将访问超出其范围的内存。

    所以做这样的事情:

    for ( int y = 0 ; y < MAP_HEIGHT ; ++y ) 
    {
        for ( int x = 0 ; x < MAP_WIDTH ; ++x )
        {
                myFile << m_acMapData[y][x]; // here to be changed
        }
    
        myFile << '\n';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多