2016-12-08 22 views
-1

私はカスタムサイズのTic Tac Toeゲームで作業しています。 保存ファイルを作成したいので、終了する前にユーザーがゲームを終了すると、前のゲームを再度ロードして続行できます。Cのファイルから2D配列を読み込む

私は1つのセルと構造体にもenumを使用しました。 SIZEを読む

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

すでにこれで動作します:

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 

あなたは私がボードを読み取ることができますどのように任意のヒントを持っていますか?

+0

[テキストファイルから2D配列に数値を読み込む]可能な複製(http://stackoverflow.com/questions/30064121/read-numbers-from-text-file-to-2d-array) – xenteros

+0

ファイルから行ごとに。 – roottraveller

答えて

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

私はコードをテストしませんでしたが、アイデアの要点を示します。

+0

はい私は考えを参照してください。プログラムが受信信号SIGSEGV、セグメンテーションフォールトで受信したときにプログラムがクラッシュします。 – GregX

+0

@GregX OK、コードを編集します.fscanfのファイルハンドルを忘れました。 – Arash

+0

はい私はすでにコードで編集しましたが、それでも何らかの理由でクラッシュする。例えば、セルが 'x'の場合は、その場合に進み、そのエラーが発生します。 – GregX

関連する問題