c - 从C中的文件读入二维数组

标签 c

我正在开发一个自定义尺寸的 Tic Tac Toe 游戏。 我想制作一个保存文件,这样如果用户在游戏结束前离开游戏,他可以再次加载上一个游戏继续。

我对一个单元格和一个结构体使用了枚举。

typedef enum Cell {                                    
   c_empty, c_circle, c_cross
} Cell;

typedef struct Game {
    Cell** board;
    int SIZE;
} Game;


Game gboard;
static void file_write(Game* pgboard);
static void file_read(Game* pgboard);
<小时/>

读取 SIZE 已经可以使用此方法:

fscanf(fp, "%d", &pgboard->SIZE);

并将其写入文件:

fprintf(fp, "%d\n", pgboard->SIZE);

还将板写入文件可与 switch 一起使用:

for (j = 0; j < pgboard->SIZE; ++j){
    for (i = 0; i < pgboard->SIZE; ++i){
        switch (pgboard->board[j][i]) {
            case c_empty:   fprintf(fp, " "); break;
            case c_circle:  fprintf(fp, "o"); break;
            case c_cross:   fprintf(fp, "x"); break;
        }

所以我的文件现在是这样的:

  13
  x          o                                                    x

您对我如何读回黑板有什么建议吗?

最佳答案

虽然更好的方法是以数字格式而不是字符串读取/写入数据,但无论如何,这里的代码可以完成您想要的操作。

char cell;

fscanf(fp, "%d", &pgboard->SIZE);
fscanf(fp, "%c", &cell); /* to get rid of new line */

for (j = 0; j < pgboard->SIZE; ++j){
    for (i = 0; i < pgboard->SIZE; ++i){
        fscanf(fp, "%c", &cell)
        switch (cell) {
            case ' ': pgboard->board[j][i] = c_empty; break;
            case 'o': pgboard->board[j][i] = c_circle; break;
            case 'x': pgboard->board[j][i] = c_cross; break;
        }
    }
}

我没有测试代码,但它会显示这个想法的要点。

关于c - 从C中的文件读入二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036349/

相关文章:

c - 当两个路径都有空格时,如何使用 C 程序中的文件启动外部程序?

c - fork() 的意外输出

C - 合并排序的合并部分

c++ - 如何确定路径是否指定了实际文件?

c++ - 平面方程的多面体

c - 尝试在 do while 循环中嵌套 if 语句时出现未知语法错误

ios - 将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数

c++ - 将源文件包含在另一个源中

c - 使用指向 struct C 的指针分配数组并返回该数组

c - 替换 read(int fd, void *buf, size_t count); Linux 中的晶圆?