写文件过程崩溃!关闭

Crash on write file procedure !closed

本文关键字:关闭 崩溃 过程 文件      更新时间:2023-10-16

我编写了一个过程,必须将 2D 数组写入文件。代码如下:

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);
 }

它正在编译,但在调用此函数时应用程序崩溃。 我将其称为Cocs2D-X菜单项menu_selector属性。为什么会崩溃?

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

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

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

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

  3. 你真的想把它写成二进制格式的 int 的字符串表示吗?打开文件进行二进制输出意味着您将在那里写入原始数据。您可以使用下一个代码将 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);
}

'

你在几个地方超出了数组边界,所以你正在破坏内存。 例如:

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()

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。