我是C的新人(实际上是编程),我需要为大学做一个tic tac toe游戏。
在每场比赛结束时,我需要将玩家信息保存在txt文件中,并将游戏信息保存在二进制文件中。
.txt如下: playerName; X | O; playerName; X | O
binarye文件接收匹配号,整个阵列(3x3)与玩家轮流(X | O)和匹配结果(X | O | V< -for draw)。
由于我需要在一系列游戏结束时显示所有匹配项,我打算迭代txt文件并为每一行访问二进制文件中的相应信息。
这正确生成了txt文件:
void inc_txt(){
FILE *f = fopen("tictac.txt", "a+");
fprintf (f, "%s;%c;%s;%c\n", name1, jog1, name2, jog2);
fclose(f);
}
这显然只记录了一个匹配细节:
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)中,我曾经声明一个类型,然后是该类型的文件,然后查找(文件,位置)并且可以在给定位置读取或写入(我将通过迭代txt文件获得) ,没有任何问题,但我无法实现如何在C中实现等效任务。感觉我应该以某种方式将块大小或fread指针相乘,但到目前为止还无法找到解决方案。
如何从二进制文件中找到特定的匹配详细信息?
答案 0 :(得分:1)
我是C的新人(实际上是编程),我需要为大学做一个tic tac toe游戏。
这三个不计算!一个人不应该是编程的新手,也不应该同时是C的新手,因为唯一合理的指南似乎假设了最低限度的必备知识。
当然,你会找到那些声称教C作为入门语言的人。我不是说通过你的大学学习C作为第一语言是不可能的,但我没有足够的信心打赌它。然而,一本好书会带你去那里。
也许SICP,在K&amp; R2E之前会很好。看起来你可以使用一些指导来更自由地使用参数; SICP将为您提供帮助。
继续......
帕斯卡尔......
我很快就会学习C,好像它与Pascal有相似之处,而不是学法语,好像它与德语有相似之处。它们都是程序编程语言,表面上还有一些其他模糊的相似之处,其中有一些令人震惊但又微妙的陷阱。你应该学习有UB的语言,好像他们可能有一个带有气体或尖刺陷阱的秘密门......当然,这都是探索的乐趣!
...我曾经声明一个类型,然后声明该类型的文件,然后查找(文件,位置)并可以在给定位置读取或写入(我将通过迭代txt文件得到),没有问题,但我无法实现如何在C中实现等效任务。
由于文件的概念来自Unix,而C被认为是Unix系统语言,因此C中的想法非常相似。您可以使用fseek
来{{1} }, 例如。或者,如果你被绑定到类似Unix的系统(例如Linux,BSD,Solaris,Mac OS等),你可以使用fseek(file, index * size_of_object, SEEK_SET)
将内存区域映射到文件,这样你就可以例如,将2GB文件视为您的阵列。在选择之前你已经阅读了一些手册,但这是一个很好的选择。
如何从二进制文件中找到特定的匹配详细信息?
P.S。我希望(并因此建议)mmap
参数为size
,sizeof (struct TicTac)
参数为nitems
,而不是反过来...另一种方式周围更可能是马车。看看你如何编写1
代码作为一个很好的例子:fwrite
...现在用fwrite(&Match, sizeof(struct TicTac), 1, bfp);
替换fwrite
并且你有一个读取而不是写入。但是,在您的读取中,您可以交换稍微改变行为的中间参数。