2

私はゲームを作成していて、マップデータをサイズの2次元配列に保存しました[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;
}

誰かが問題が何であるか知っていますか?

4

2 に答える 2

3
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 )も読むことをお勧めします。

于 2009-12-09T10:22:10.233 に答える
0

あなたがここで間違っているので、私は間違いなくクラッシュします。

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 = 3し、MAP_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';
}
于 2009-12-09T10:37:30.530 に答える