作为一个研究项目,我们正在标准 C (BINARY) 文件处理库 (stdio) 之上编写一个抽象层,通过提供一些额外的函数来处理带有事务的文件。
工作流程如下:
- 用户使用我们的 API(或标准)打开文件
fopen
。两者都返回FILE*
。文件以 BINARY 模式打开! - 用户使用标准库命令(例如
fwrite
)将数据写入文件 - 用户使用我们的 API 在打开的文件上打开一个事务:
TRANSACTION a = trans_start(FILE* )
TRANSACTION
用户为对象设置数据验证器(set_validator(TRANSACTION, int(*)(char*))
- 用户使用我们自己的 API 将数据“写入”文件(
int trans_write_string(TRANSACTION*, char*, length)
- 实际上,这种“写入”将其数据放入上面定义的验证器的内存中,这些验证器可能会对数据进行操作并在某处设置一些标志……与问题无关。
- 用户使用
trans_commit(TRANSACTION)
以实际将数据写入文件。现在,根据验证器设置的标志,这可能不会将数据写入文件,而是向用户报告错误(可以通过编程方式解决。...与问题不太相关)。 - 用户使用标准 API 关闭文件
fclose
。
到目前为止,我们只有 API ( trans_write_string
) 的字符串处理方法,它工作得很好。它在内存中构建自己的数据缓冲区,根据需要修改内容,调用验证器等...在连续调用时,它将新数据附加到其内部内存缓冲区中,处理分配等...并在成功提交时写入使用fwrite
(是的,这主要是一个 C 项目,但是 C++ 答案也不会被排除)。
但是现在我们想要(......必须)扩展 API 以便能够写入数字(16 位、32 位、64 位)并且也可以浮动......以与标准C
stdio API非常相似的方式它。使用已经存在的字符串实现,这假设我们在内存中有一个数据缓冲区,它保存N
字符字节(字符串本身),我们可能需要 2 个字节用于 16 位值,然后另一个M
字节用于另一个字符串,64 位值的 8 个字节,16 位值的 2 个字节,等等......
我们陷入了“如何在文件中表示一个数字,以便使用不同计算机/架构/操作系统/字节序的其他人也可以读取”这一点上。
char* addr = &my_16bit_int
理论上可以通过转换为 char ( )将数字插入内存流中,*(addr)
并将其放置*(addr + 1)
到所需的地址(即:在N
字符串的字符之后)并将其写入文件也是可能的,但是如果我想要怎么办在字节序不同的不同架构上读取生成的文件?如果“其他”计算机只是一堆 16 位的古老金属怎么办?在这种情况下,写入文件中的 64 位值会发生什么情况?
解决此类问题有哪些好的做法?
编辑:目标文件必须是二进制的,它会附带一个描述其格式的文本文件(XML)(例如:N
8字节字符,1
16位值等)(这个文本文件是根据我们的输出生成的心爱的验证者)。验证器“说”类似,是的,我接受这个 16 位值,不,我拒绝这个长字符串,等等......并且其他人正在基于这个“输出”创建数据格式 XML。
EDIT2:是的,我们需要在各种平台上共享文件,甚至是 20 年的大冰箱大小的盒子 :)
EDIT3:是的,我们也需要浮动!