写文件程序崩溃!关闭

时间:2012-12-07 08:35:30

标签: c++ visual-c++ crash cocos2d-x

我写了一个必须将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属性。为什么会崩溃?

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分: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()

答案 2 :(得分:0)

char *buffer=itoa(levelmap[i][j],asd,1);

itoa的最后一个参数是基础。它应该是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&lt; 15和j&lt; 9。