从C中的文件读入2D数组

时间:2016-12-08 09:50:44

标签: c

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

我将enum用于一个单元格,也用于结构。

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);

将电路板写入文件也可以使用开关:

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

您有什么提示我如何回读电路板?

1 个答案:

答案 0 :(得分:0)

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

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;
        }
    }
}

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

相关问题