【发布时间】:2017-12-15 17:08:14
【问题描述】:
我正在尝试将一个板(这是一个已动态分配的二维数组)保存到一个文件中,以便用户以后可以“加载”它并且他们可以再次使用该板。要保存电路板,用户必须输入s filename。为了获取用户输入,我有一个用于保存命令的 else if 语句:
else if (playerMove.command == 's') {
char* fileName = NULL;
scanf(" %s", fileName);
implementSave(boardState, fileName);
由于我们只学习了如何在 C 中读取/打开/写入二进制文件,因此我尝试在我的 implementSave 函数中对此做同样的事情:
void implementSave(BoardState* boardState, char* fileName) {
FILE* file = fopen(fileName, "wb");
fwrite(fileName, sizeof(char), sizeof(boardState->board.theBoard), file);
fclose(file);
}
注意:我在我的程序中使用了一些结构;结构体board 包含char** theBoard, int numRows, int numCols, char blankSpace。
但是,当我尝试运行保存命令时,这给了我一个错误。谁能指出我正确的方向?
【问题讨论】:
-
什么样的错误?如果只是没有正确保存,那是因为
sizeofachar**是 4 或 8(或类似的东西)。您应该计算要直接保存或加载的字符单元数:boardState->board.numRows*boardState->board.numCols。 -
char* fileName = NULL; scanf(" %s", fileName);-- 您没有为fileName... 分配存储空间。另外请注意,%s指令 自动 会跳过前导空格,所以没有格式字符串中需要前导空格。 -
取决于
BoardState是什么。但是fwrite(fileName, sizeof(char), sizeof(boardState->board.theBoard), file);看起来完全错误。你的意思是fwrite(boardState, sizeof(char), sizeof(boardState->board.theBoard), file);? -
如果
theBoard是char **,您将无法写出,因为theBoard的每个元素都是一个指针,它没有意义 - 您需要写出每一行分别 -
您的二维数组是如何/在哪里声明的?见How to create a Minimal, Complete, and Verifiable example。对于
type **(指向类型指针的指针),您应该将值的总数写为文件中的第一个值(可能还有大小——在那之前的char, short, int..),然后您必须为每个指针调用一次fwrite才能写入值。根据您的声明,不能保证这些值在内存中是连续的。