使用直接访问二进制文件

时间:2016-12-05 17:01:31

标签: c

我是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指针相乘,但到目前为止还无法找到解决方案。

如何从二进制文件中找到特定的匹配详细信息?

1 个答案:

答案 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文件视为您的阵列。在选择之前你已经阅读了一些手册,但这是一个很好的选择。

  

如何从二进制文件中找到特定的匹配详细信息?

  1. 从文件中读取一个项目。
  2. 测试项目以检查它是否是您正在寻找的项目。如果没有,请转到1.
  3. 如有必要,请重新阅读该项目和/或进行最终测试,以确保您阅读的项目匹配。
  4. P.S。我希望(并因此建议)mmap参数为sizesizeof (struct TicTac)参数为nitems,而不是反过来...另一种方式周围更可能是马车。看看你如何编写1代码作为一个很好的例子:fwrite ...现在用fwrite(&Match, sizeof(struct TicTac), 1, bfp);替换fwrite并且你有一个读取而不是写入。但是,在您的读取中,您可以交换稍微改变行为的中间参数。