Save/Load C语言函数
Save/Load function in C language
我正在开发一个游戏程序,它要求我将一个二维数组保存到一个文件中,然后如果用户想返回那个游戏,然后可以重新加载它并继续它。但是我在将数组保存到 txt 文件时遇到了问题。对于加载函数,它无法加载任何东西。用户应该 select 加载选项,它应该能够调用带有数组的 txt 文件,然后允许他们继续玩游戏。
这是我的保存功能
void save(char *filename)
{
FILE *fp = fopen(filename, "wb");
fwrite(&size, sizeof(size), 1 , fp);
fwrite(board, sizeof(int), size, fp);
if(fp == NULL)
return;
fclose(fp);
}
这是我的加载函数
void load(char *filename)
{
FILE *fp = fopen(filename, "rb");
fread(&size, sizeof(size), 1 , fp);
fread(board, sizeof(int), size, fp);
if(fp == NULL)
return;
fclose(fp);
}
稍后在代码中,我使用菜单调用这些函数。
任何帮助将不胜感激!
首先,加载时写RB
。其次,不要忘记在输入 FILE
命令后关闭所有文件。
另外,我有一个建议给你:总是检查 *fp
是否等于 NULL
;它非常适合调试,并且会对您的代码产生巨大影响。您也可以在程序中使用文件时编写一个用于多次检查的函数。
board
不是二维数组,它是指向行的指针数组。您需要遍历它,分别写入和读取每一行。
由于正在加载的板子的大小可能与当前内存中的板子不同,加载时需要释放旧的板子,重新分配新的板子。
void save(char *filename)
{
FILE *fp = fopen(filename, "wb");
if (!fp) {
perror("Can't open save file");
return;
}
fwrite(&size, sizeof(size), 1 , fp);
for (int i = 0; i < size; i++) {
fwrite(board[i], sizeof(*board[i]), size, fp);
}
fclose(fp);
}
void load(char *filename)
{
FILE *fp = fopen(filename, "r");
if (!fp) {
perror("Can't open save file");
return;
}
if (board) {
for (int i = 0; i < size; i++) {
free(board[i]);
}
free(board);
}
fread(&size, sizeof(size), 1 , fp);
board = malloc(size * sizeof(*board));
for (int i = 0; i < size; i++) {
board[i] = malloc(size * sizeof(*board[i]));
fread(board[i], sizeof(*board[i]), size, fp);
}
fclose(fp);
}
我正在开发一个游戏程序,它要求我将一个二维数组保存到一个文件中,然后如果用户想返回那个游戏,然后可以重新加载它并继续它。但是我在将数组保存到 txt 文件时遇到了问题。对于加载函数,它无法加载任何东西。用户应该 select 加载选项,它应该能够调用带有数组的 txt 文件,然后允许他们继续玩游戏。
这是我的保存功能
void save(char *filename)
{
FILE *fp = fopen(filename, "wb");
fwrite(&size, sizeof(size), 1 , fp);
fwrite(board, sizeof(int), size, fp);
if(fp == NULL)
return;
fclose(fp);
}
这是我的加载函数
void load(char *filename)
{
FILE *fp = fopen(filename, "rb");
fread(&size, sizeof(size), 1 , fp);
fread(board, sizeof(int), size, fp);
if(fp == NULL)
return;
fclose(fp);
}
稍后在代码中,我使用菜单调用这些函数。 任何帮助将不胜感激!
首先,加载时写RB
。其次,不要忘记在输入 FILE
命令后关闭所有文件。
另外,我有一个建议给你:总是检查 *fp
是否等于 NULL
;它非常适合调试,并且会对您的代码产生巨大影响。您也可以在程序中使用文件时编写一个用于多次检查的函数。
board
不是二维数组,它是指向行的指针数组。您需要遍历它,分别写入和读取每一行。
由于正在加载的板子的大小可能与当前内存中的板子不同,加载时需要释放旧的板子,重新分配新的板子。
void save(char *filename)
{
FILE *fp = fopen(filename, "wb");
if (!fp) {
perror("Can't open save file");
return;
}
fwrite(&size, sizeof(size), 1 , fp);
for (int i = 0; i < size; i++) {
fwrite(board[i], sizeof(*board[i]), size, fp);
}
fclose(fp);
}
void load(char *filename)
{
FILE *fp = fopen(filename, "r");
if (!fp) {
perror("Can't open save file");
return;
}
if (board) {
for (int i = 0; i < size; i++) {
free(board[i]);
}
free(board);
}
fread(&size, sizeof(size), 1 , fp);
board = malloc(size * sizeof(*board));
for (int i = 0; i < size; i++) {
board[i] = malloc(size * sizeof(*board[i]));
fread(board[i], sizeof(*board[i]), size, fp);
}
fclose(fp);
}