我写了一个必须将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
属性。为什么会崩溃?
更新:更改为文件流广告效果非常好
答案 0 :(得分:3)
不仅是上面提到的错误......
确保您的文件夹“resources / lvls /”确实存在。 fopen不会创建文件夹!
itoa的第三个参数 - 基数(值的基数;必须在范围2-36 。)
你真的想把它写成二进制格式的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);
}
答案 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。