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