最近大一的学弟开始布置C语言的大作业了,于是在此提供一种比较简单的2048存档读档功能的实现
记得自己大一的时候在这里研究了很久,在这里提供C语言的实现思路
首先是用到的函数介绍:
按住Ctrl后点击getcwd可以知道getcwd接受两个变量:一个char*,用于以字符串形式保存绝对地,另一个变量是第一个变量字符串的大小,以防止出现路径长度大于字符串长度的情况。返回值就是当前路径的字符串形式。以下是常见用法的demo
对于这种用法有一个显而易见的问题:我们无法判断当前路径的长度,因此只能尽可能开大这个字符串的空间。但是另一方面,开过大的字符串难免会造成内存空间的浪费。
还记得之前说的getcwd的返回值是字符串首地址吗?在getcwd函数运行过程中,函数会自动申请空间来储存这个字符串。因此我们可以不给字符串申请空间来使getcwd自动申请内存空间,并将返回值首地址赋给用于储存的char*。样例如下:
在获取到当前路径后,我们就可以用fopen函数打开存档文件,在此之前先复习下fopen的基本用法
fopen接受两个char*变量,第一个记录文件的路径,第二个表示文件的读取模式,返回值为File*(文件指针)
对于第一个变量,我们需要传入完整的文件路径,这就需要我们将文件名和路径两个字符串拼接在一起(不会的自行复习strcat()函数)
获取到文件名之后,按照fopen的访问规则打开文件即可,常用的访问规则有:
对我们要实现的功能进行分析,读档自然是使用"r+"
模式,读取已有的存档,如不存在返回失败。
对于存档,覆盖已有存档或保存新存档,则使用"w+"
模式
综上所述,对于存档打开过程,可以写出如下代码:
在讨论存档格式前,我们先参考下常见ACM题目对于图论题存图的用例形式
由此可知,我们可以使用邻接矩阵的方式,在文件和内存之间相互转化
第一行,给出一个整数 n
,表示方阵的边长(如不是方阵则设为 n m
两个整数分别表示长和宽)
以下 n
行,每行给出 n
个整数,表示当前位置的值
由函数名就不难看出,这两个函数与scanf()
和printf()
非常相似,事实上这两个函数在使用上只要在传参的最前面加上FILE* fp
即可
例如从fp
指向的文件读入一个整数到n
:
再例如向fp
指向的文件输出一个整数n
:
综上我们可以写出完整的存档读档代码如下:
测试读档功能:
测试存档功能:
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪