C++ 写文件程序崩溃!关闭
我写了一个将2d数组写入文件的过程。以下是代码: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; } }
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);
}