用于将字符串从文件读取到3D数组的循环

时间:2011-05-04 20:37:19

标签: c++ vector 3d for-loop sdl

我的一个功能有问题,我正在使用一个简单的平铺地图编辑器,我正在尝试实现一个3D数组来跟踪平铺(x,y,层)。在此之前,我有一个1D数组,其中所有的瓷砖都是按顺序列出的:

bool Map::OnLoad(char* File) {
    TileList.clear();
    FILE* FileHandle = fopen(File, "r");
    if(FileHandle == NULL) {
        return false;
    }

    for(int Y = 0;Y < MAP_HEIGHT;Y++) {
        for(int X = 0;X < MAP_WIDTH;X++) {
            Tile tempTile;

            fscanf(FileHandle, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);

            TileList.push_back(tempTile);
        }
        fscanf(FileHandle, "\n");
    }
    fclose(FileHandle);
    return true;
}

这基本上是从文件中读取的字符串,如下所示:

2:1 1:0 3:2...

第一个数字表示tileID,第二个表示Tile可通过性。 以上功能正常运作。我的3D数组也正确构建,我用简单的赋值测试它们并从中调用值。 给我带来问题的功能如下(请注意,数字2即OnLoad2()已添加,因此我可以保持旧变量和函数不变,直到原型工作):

bool Map::OnLoad2(char* File) {
    TileList2.clear();
    FILE* FileHandle2 = fopen(File, "r");
    if(FileHandle2 == NULL) {
        return false;
    }

    for(int Y = 0;Y < MAP_HEIGHT;Y++) {

        for(int X = 0;X < MAP_WIDTH;X++) {
            Tile tempTile;
            fscanf(FileHandle2, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);

            TileList2[X][Y][0] = tempTile;
        }
        fscanf(FileHandle2, "\n");
    }
    fclose(FileHandle2);
    return true;
}

虽然此函数不会触发编译器报告任何错误,但一旦应用程序启动,它就会冻结并崩溃。有关其他信息, MAP_WIDTH和MAP_HEIGHT设置为每个,3D阵列的构造如下:

TileList2.resize(MAP_HEIGHT);
for (int i = 0; i < MAP_HEIGHT; ++i) {
    TileList2[i].resize(MAP_WIDTH);
    for (int j = 0; j < MAP_WIDTH; ++j)
        TileList2[i][j].resize(3);
}

如果您能指出我需要解决的问题,我将不胜感激,据我所知,我必须弄乱for循环结构,因为3D数组初始化并正常工作。谢谢你的帮助!

1 个答案:

答案 0 :(得分:5)

TileList2.clear();

此行重新初始化TileList2,因此它返回到零长度向量。删除该行,你可能会没事的。