先举个例子,如果你了解一下csv格式和txt格式就会发现,csv格式只不过是使用txt格式并把内容按照表的分列用逗号隔开了而已(然后换了个扩展名)。
那么,要设计一种文件格式,如果只是你自己用,那你想怎么存就怎么存、按什么顺序存信息你自己决定就可以了,扩展名最好不要跟常用的一样,然后保证你的程序能读出文件内容就好。
然后大家试试更进一步,要使你自己设计的这个格式有区分性,比如,你可以要求扩展名必须为wdgs,然后这个文件第一行头四个字节必须是542B(16进制)。为什么要这样做?这是为了区分同样叫wdgs的扩展名的文件究竟是不是你的文件。
然后如果按照工程角度的设计出发,后面一般会跟文件格式版本用的几个字节,你也可以考虑设计上去,这是为了如果以后你修改了你的文件格式,还能根据版本用不同的解析方法把文件内容读出来。
再然后还是按照工程角度出发,可以考虑加上记录文件总大小用的几个字节,这是为了当一个文件涉及网络传输或拷贝等时,你还能大概判断这文件是不是完整。
接下来的部分,就看你拿这文件干什么了。如果只是存键值对组合,那直接存就行了,加些标签存也可以(这方面的例子参见XML和JSON的文件格式,XML有些在头部还有明文的版本号、适用标准等等信息,json一般就只存实质内容了,就是那些键值对,甚至格式也直接用符号来区分了,标签也省了。html文件也是这样的例子)。
如果是要存图片,那可以把像素逐个解析出来按颜色存储,事实上,这就是BMP文件格式的做法。
看到bmp可能你又考虑jpg、png这些,这些是涉及了压缩算法的,所以实际存在文件里时,要把文件分节分段,然后一节存图片本身的像素摘要信息,一节存插值算法的摘要信息等等(你不明白的话,可以这样考虑:偶要存10000000000这个数,那么偶可以存成“10000000000”,也可以存成“1后十个0”对吧,显然后者比前者短了,也就是减小了文件大小)
有了分节分段这些策略以后,存个视频什么的都不是问题了,可以把视频存成一帧一帧的(事实上原始格式的avi就是这样),依次类推。
这样,你只要考虑你要存哪些东西,这些东西怎么转变为有序的数字/文字/字节(事实上最终都是字节)以供你存的时候能记住、取的时候不会乱,这样就能设计出你需要的文件格式了。
你要是乐意,也可以要求你的文件必须以你的名字+万岁的UTF8编码为结束才能被认可,哈哈,只要大家认可这格式就行。所谓你写的程序,规则是你定的。