2016-12-05 30 views
2

我是C新手(實際上編程),我需要爲大學做一個tic tac toe遊戲。使用直接存取二進制文件

在每場比賽結束時,我需要將球員信息保存在txt文件中,並將遊戲信息保存在二進制文件中。

中的.txt是如下: playerName; X | O; playerName; X | O

的binarye文件接收匹配號碼,整個陣列(3×3)與玩家匝(X | O)和比賽結果(X | O | V <)。

由於我需要在一系列遊戲結束時顯示所有匹配項,因此我打算遍歷txt文件並針對每一行訪問二進制文件中的相應信息。

這正確生成txt文件:

void inc_txt(){ 
FILE *f = fopen("tictac.txt", "a+"); 
fprintf (f, "%s;%c;%s;%c\n", name1, jog1, name2, jog2); 
fclose(f); 
} 

這顯然是記錄只是一個比賽細節occurency:

void inc_bin(char result){ 
memcpy(Match.TicTac, tictac, sizeof(Match.TicTac)); 
Match.result = result; 
FILE *bfp = fopen ("tictac.bin", "wb"); 
fwrite(&Match, sizeof(struct TicTac), 1, bfp); 
fclose(bfp);  
} 

這成功地從bin文件打印出一個匹配的內容:

FILE* f1 = fopen ("tictac.bin", "rb"); 
fread(&Match, 1, sizeof(struct TicTac), f1); 
printf("Match: %d \n", Match.match); 
for(int lin = 0 ; lin < 3 ; lin++){ 
    for(int col = 0 ; col < 3 ; col++){ 
     printf(" %c ", Match.TicTac[lin][col]); 
     if(col != (3-1)) 
      printf("|"); 
    } 
    putchar('\n'); 
} 
putchar('\n'); 
printf("Result: %c", Match.result); 
fclose(f1); 

在pascal(學習alg)我用來聲明一個類型和na文件,然後尋找(文件,位置),並可以讀或寫在給定的位置(我會通過迭代txt文件),沒有問題,但我不知道如何實現等同的任務C.感覺我應該以某種方式乘以塊大小或fread指針,但是到目前爲止找不到解決方案。

如何從二進制文件中找到特定的匹配詳細信息?

+0

如果您已經知道如何生成.txt文件,要寫入bin文件並從這些文件讀取數據......您想要準確地知道什麼? – yLaguardia

+1

您提到的Pascal函數的C相當於'fseek()',通常用於結構化二進制文件,而不是文本文件。此外,如果您再次調用類似的'fread',您的代碼將成功打印出一個匹配結果,則會在文件中獲得* next *匹配結果。 –

+0

所以我必須使用fseek()寫入th bin文件。 fseek(bfp,linefromcounttxt,seek_set)? 我對這個尋求的誤解是,在pascal中,我將該文件聲明爲「結構文件」,但在C上沒有找到類似的內容。如何指定塊長度? 此外,沒有必要尋求閱讀,因爲我會迭代txt文件,對吧? –

回答

0

我是C新手(實際上編程),我需要爲大學做一個tic tac toe遊戲。

這三個不計算!對於編程而言,一個人不應該是新手,而應該是C的新手,因爲唯一合理的指導者似乎會承擔最低限度的先決知識。

當然,你會發現那些聲稱教C作爲介紹性語言的人。我並不是說通過你的大學學習C語言不可能作爲第一語言,但我不會有足夠的信心去打賭。然而,一本好書可以幫助你。

也許SICP,之前K & R2E會很好。你似乎可以更寬鬆地使用一些指導原則, SICP將幫助你。

談完...


在帕...

我會不早學C,彷彿它與帕斯卡的相似之處比我會學習法語,就好像它與德國人有相似之處。它們都是過程式編程語言,表面上還有一些模糊的相似之處,它們之間有一些令人震驚但又微妙的細節。你應該學習那些有UB的語言,好像他們可能有一個帶有氣體或釘的陷阱的祕密門......當然,這些都是探索的樂趣!


...我用來聲明類型,然後一個該類型的文件,再求(文件位置),並可以閱讀或在指定位置寫(我會通過遍歷得到txt文件),沒有問題,但我不知道如何在C

由於文件的想法達到相同的任務從Unix而來,和C被公認爲Unix系統的語言中,想法在C中非常類似。例如,您可以使用fseekfseek(file, index * size_of_object, SEEK_SET)。或者,如果你被綁定到一個特別類Unix的系統(比如Linux,BSD,Solaris,Mac OS等),你可以使用mmap來將一個內存區域映射到一個文件,所以你可以舉個例子, 2GB文件,就好像它是你的陣列一樣。這是一個選項之前,你已經閱讀了幾本手冊,但這是一個很好的選擇。


我怎麼能找到二進制文件特異性比賽細節?

  1. 從文件中讀取一個項目。
  2. 測試項目以檢查它是否是您正在尋找的項目。如果不是,請轉到1.
  3. 如有必要,請重新閱讀該項目和/或執行最終測試以確保您閱讀的內容匹配。

P.S.我期望(因此建議)size參數是sizeof (struct TicTac),並且nitems參數是1,而不是其他方式...反過來更可能是越野車。看你如何編寫你的fwrite代碼作爲一個很好的例子:fwrite(&Match, sizeof(struct TicTac), 1, bfp); ...現在用fread代替fwrite,你有讀取而不是寫入。然而,在你的閱讀中,你交換了改變行爲的中間參數。