我正在使用C/UNIX,并且有一个包含大量记录的输入文件。我已经将每个记录映射到一个结构,并通过在数据库中的记录中添加缺失的信息将该结构写入输出文件。
我的问题是将结构(由字符数组组成)写回文件。我正在使用
fwrite(&record, sizeof(record), 1, out);
fwrite("n", 1, 1, outfd);
这将在输出文件中写入数据,并在每个成员之后使用终止NULL"\0"。请告诉我如何在不在每个成员后终止"\0"的情况下将此结构写入文件。
我想这0是字符数组的一部分——它们位于每个C字符串的末尾。如果您需要将字符串写入没有零的文件,您可以写入单独的字符数组,只写入字符而不写入尾部的零(您可以使用strlen()
来查找此长度),即
fwrite(CHARArray,1,strlen(CHArray),out);
但是,您可能需要在文件中写入一些关于每个字符串长度的信息。
这将完全按照存储在内存中的方式写出record
,但编译器可以自由地在成员之间插入填充,如果这样做了,它将写出那些填充字节中的任何值。
许多(大多数?)编译器都有不可移植的方法来阻止它们插入填充——MSVC使用#pragma pack(1)
,gcc使用__attribute(__packed__)
(至少有些版本也支持#pragma pack
语法)。
也有可能您已经定义了record
,将一些零字节作为数据的一部分(例如,具有零终止符的char数组使其成为字符串)。由于您还没有展示record
的定义,因此很难猜测这是否适用。
编辑:根据你的评论,似乎是后者。我想说的第一点是,去除这些可能不是一个好主意。如果删除它们,则必须执行操作,让读取数据的程序知道一个字段的结束位置和下一个字段开始位置(除非字段是固定宽度的,可以隐式处理)。
最明显的可能性是在每个字段前面加上它的长度。这样做的优点是,如果/当您想查找文件时,您可以从一个字段转到下一个字段,而无需读取数据来查找终止字节。然而,通常我会使用索引——一个包含数据中连续记录的文件偏移量的文件(可能还有每个记录的一些关键数据,因此您可以根据记录的内容快速搜索),这样您就可以快速查找记录的位置并读取其数据。除非你有非常大的字段,否则寻找单个字段很少能取得多大成就。