C++ 写文件程序崩溃!关闭

C++ 写文件程序崩溃!关闭,c++,visual-c++,crash,cocos2d-x,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; } }

我写了一个将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);
 }
void Level::loadLevel(){
国际水平地图[15][9];
文件*fp=fopen(“resources/lvls/loc1.map”、“wb”);
对于(int i=0;i
itoa的最后一个参数是base。它应该是10而不是1(请参阅)


void Level::loadLevel(){
国际水平地图[15][9];
文件*fp=fopen(“resources/lvls/loc1.map”、“wb”);
对于(int i=0;i
itoa的最后一个参数是base。它应该是10而不是1(请参阅)


void Level::loadLevel(){
国际水平地图[15][9];
文件*fp=fopen(“resources/lvls/loc1.map”、“wb”);

对于(int i=0;i您在几个位置超过了数组边界,因此正在破坏内存。例如:

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

// ...

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

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

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

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

// ...

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

不做你认为它做的事,因为
sizeof(buffer)
是指针的大小,与缓冲区中的字符数无关。为什么要将
2
作为元素的大小传递给
fwrite()

不仅仅是上面提到的错误

  • 确保文件夹“resources/lvls/”确实存在。fopen不会创建文件夹

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

  • 是否确实要以二进制格式将其作为int的字符串表示形式写入?打开二进制输出文件意味着您将在其中写入原始数据。您可以使用下一个代码将int数组保存并加载到文件中:

  • "

    void saveLevel()
    {
    国际水平地图[15][9];
    文件*fp=fopen(“loc1.map”、“wb”);
    
    对于(inti=0;i不仅上述错误

  • 确保文件夹“resources/lvls/”确实存在。fopen不会创建文件夹

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

  • 是否确实要以二进制格式将其作为int的字符串表示形式写入?打开二进制输出文件意味着您将在其中写入原始数据。您可以使用下一个代码将int数组保存并加载到文件中:

  • "

    void saveLevel()
    {
    国际水平地图[15][9];
    文件*fp=fopen(“loc1.map”、“wb”);
    

    对于(int i=0;iIs)文件是否真正打开?请检查
    fopen
    的返回值。您还可以在循环中对数组进行一对多索引。它是如何崩溃的?引发了什么异常?哪一行出错?您是否尝试调试此代码?是的,它已打开。文件已清除并关闭。尝试此代码:void Level::loadLevel(){FILE*fp=fopen(“resources/lvls/loc1.map”,“w+”);fwrite(“test”,1,sizeof(“test”),fp);fclose(fp);}但是它返回
    运行时检查失败#0
    您无法写入apk文件。您只能写入SD卡(如果您有权限)或getWriteablePath()在CCFileUltis中。文件真的打开了吗?检查
    fopen
    的返回值。您还可以在循环中对数组进行一对多索引。它是如何崩溃的?引发了什么异常?哪一行出错?您是否尝试调试此代码?是的,它已打开。文件已清除并关闭。尝试了此代码:void Level::loadLevel(){FILE*fp=fopen(“resources/lvls/loc1.map”,“w+”);fwrite(“test”,1,sizeof(“test”),fp);fclose(fp);}但是它返回
    运行时检查失败#0
    您无法写入apk文件。您只能写入SD卡(如果您有权限)或getWriteablePath()在CCFileUltis中。
    运行时检查失败#0
    但最后文件被更改了,我想它已经解决了。现在libcoco2d出现了问题,它返回
    运行时检查失败#0
    。我想这都是因为我不理解非cocos函数。你是什么意思?我的答案被某人(不一定是你)否决了。我想知道原因。
    运行时检查失败#0
    但最后文件被更改了,我想它已经解决了。现在libcoco2d出现了问题,它返回
    运行时检查失败#0
    。我想这都是因为我不理解非cocos函数。你是什么意思?我的答案被某人(不一定是你)否决了。我想知道,为什么。我只是增加了数组的大小。谢谢。但这不完全是错误。我只是增加了数组的大小。谢谢。但这不完全是错误。你只阅读
    [I]
    数组级别,没有将其放回
    级别映射
    。如果我指定该fread文本,它会返回整个
    [j]C++中的一维数组是一个实心内存块,所以你可以用一行代码来读写整个数组,但是你不能用包含动态字段的类数组来做它……你只需要理解对象是如何放置在内存中的。
    数组级别,并且没有将其放回
    级别映射。
    如果我将该fread文本赋值,它会返回整个
    [j]C++中的一维数组是一个实心内存块,所以你可以用一行代码来读写整个数组,但是不能用包含动态连接字段的类数组来做它……你只需要理解对象是如何放置在内存中的。
    
    int levelmap[15][9];
    //           ^^  ^
    
    // ...
    
    for (int i=0;i<=15;i++){
        //        ^^^^
        for(int j=0;j<=9;j++){
                     ^^^
            levelmap[i][j]=i+j;
        }
    }
    
    char *buffer= /* ... */;
    // ...
    fwrite(buffer,2,sizeof(buffer),fp);
    
    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);
    
    }