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

Spe*_*eed 1 c++ 3d for-loop sdl vector

我的一个功能有问题,我正在研究一个简单的平铺地图编辑器,我正在尝试实现一个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;
}
Run Code Online (Sandbox Code Playgroud)

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

2:1 1:0 3:2...
Run Code Online (Sandbox Code Playgroud)

第一个数字表示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;
}
Run Code Online (Sandbox Code Playgroud)

虽然此函数不会触发编译器报告任何错误,但只要应用程序启动,它就会冻结并崩溃.有关其他信息,MAP_WIDTH和MAP_HEIGHT分别设置为40,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);
}
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*obᵩ 5

TileList2.clear();
Run Code Online (Sandbox Code Playgroud)

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

  • @Dan,Nope,`std :: vector`不会在`std :: vector :: operator []`或`std :: vector :: at`中自动调整大小.如果要向向量添加数据并调整大小,请尝试`std :: vector :: push_back`. (2认同)