1

我编写了一个必须将二维数组写入文件的过程。这是代码:

void Level::loadLevel(){
    int levelmap[15][9];
    FILE *fp = fopen("resources/lvls/loc1.map", "wb");  
    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            levelmap[i][j]=i+j;
            }
    }
    char asd[255];

    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            char *buffer=itoa(levelmap[i][j],asd,1);
            fwrite(buffer,2,sizeof(buffer),fp);
            };
        };
    fclose(fp);
 }

它正在编译,但在调用此功能应用程序时崩溃。我称它为menu_selectorcocs2d-x 菜单项的属性。为什么会崩溃?

更新:更改为文件流广告效果很好

4

3 回答 3

3

不仅是上面提到的错误...

  1. 确保您的文件夹“resources/lvls/”确实存在。fopen 不创建文件夹!

  2. itoa 的第三个参数 - 基数(值的基数;必须在2–36 范围内。)

  3. 你真的想把它写成二进制格式的字符串表示吗?打开二进制输出文件意味着您将在那里写入原始数据。您可以使用下一个代码将 int 数组保存到/从文件中加载:

'

void saveLevel()
{
    int levelmap[15][9];
    FILE *fp = fopen("loc1.map", "wb");  
    for (int i=0;i<15;i++){
        for(int j=0;j<9;j++){
            levelmap[i][j]=i+j;
        }
    }

    for (int i=0;i<15;i++){
        fwrite(levelmap[i], sizeof(int), _countof(levelmap[i]), fp);
    };

    fclose(fp);
}

void loadLevel()
{
    int levelmap[15][9];

    FILE *fp = fopen("loc1.map", "rb");  

    for (int i=0;i<15;i++){
        fread(levelmap[i], sizeof(int), _countof(levelmap[i]), fp);
    };
    fclose(fp);

}

'

于 2012-12-07T09:54:50.047 回答
1

您在几个地方超出了数组边界,因此您正在破坏内存。例如:

int levelmap[15][9];
//           ^^  ^

// ...

for (int i=0;i<=15;i++){
    //        ^^^^
    for(int j=0;j<=9;j++){
                 ^^^
        levelmap[i][j]=i+j;
    }
}

<=在循环条件中使用for数组索引是一个危险信号。这样做几乎总是错误的,所以每当你看到代码时都要仔细检查它。

还:

char *buffer= /* ... */;
// ...
fwrite(buffer,2,sizeof(buffer),fp);

不会像您认为的那样做,因为sizeof(buffer)指针的大小与缓冲区中的字符数无关。为什么你将2元素的大小传递给fwrite()

于 2012-12-07T09:41:36.020 回答
0
char *buffer=itoa(levelmap[i][j],asd,1);

itoa 的最后一个参数是 base。它应该是 10 而不是 1(参见http://www.cplusplus.com/reference/cstdlib/itoa/


void Level::loadLevel(){
    int levelmap[15][9];
    FILE *fp = fopen("resources/lvls/loc1.map", "wb");  
    for (int i=0;i<=15;i++){
        for(int j=0;j<=9;j++){
            levelmap[i][j]=i+j;
            }
    }

如果 i == 15 和 j == 9,则超出数组的边界(levelmap[15][9] 表示 levelmap[0..14][0..8])

将循环中的条件更改为 i < 15 和 j < 9。

于 2012-12-07T09:25:40.417 回答