C 将包含字符串的结构写入二进制文件
我有一个二进制文件,其中记录了写入其他文件的偏移量以及在该偏移量处写入的数据。现在,我将每个日志记录的结构定义为C 将包含字符串的结构写入二进制文件,c,linux,binaryfiles,C,Linux,Binaryfiles,我有一个二进制文件,其中记录了写入其他文件的偏移量以及在该偏移量处写入的数据。现在,我将每个日志记录的结构定义为 struct log_record{ int offset; char *data; } struct log_record t; 当我将记录写入文件时,我拥有写入文件的数据长度,因此在分配空间之前,我会将空间分配为 t.data = (char*)malloc(sizeo
struct log_record{
int offset;
char *data;
}
struct log_record t;
当我将记录写入文件时,我拥有写入文件的数据长度,因此在分配空间之前,我会将空间分配为
t.data = (char*)malloc(sizeof(char)*strlen(buff));/*buf holds the data to be written*/
现在我有了写入文件的记录长度……但问题是在读取时。如何根据我将记录读入的结构分配空间,并在fread中分配记录的大小。我有些困惑。
非常感谢您的帮助您需要写入字符串的长度,因为字符串的长度是可变的 请注意,
strlen()
不会返回包含终止NULL的大小
编辑+编辑2(由于mu太短)+编辑3(由于mu太短)
我会这样做:
t.data = (char*) malloc(sizeof(char) * strlen(buff) + 1);
strcpy(t.data, buff);
// ...
int data_size = strlen(t.data) + 1;
fwrite(&t.offset, 1, sizeof(t.offset), file);
fwrite(&data_size, 1, sizeof(data_size), file);
fwrite(t.data, 1, strlen(t.data) + 1, file);
不可能将大小可变的结构写入二进制文件,然后在没有任何大小记录的情况下再次读取它们。您可以使用具有固定大小的字符数组而不是字符指针,或者使用自定义文件格式记录每个元素的大小(如果您需要它们的长度可变) 因为我没有更好的事情要做,所以我写了一个小程序,我希望它能满足您的需求。无错误检查:)
#包括
#包括
#包括
类型定义结构{
整数偏移量;
整数长度;
字符*数据;
}日志记录;
无效写入文件(常量字符*文件名)
{
日志记录lr;
const int num_records=10;
char-buf[100];
int i;
文件*fp;
fp=fopen(文件名,“wb”);
对于(i=0;i
您应该避免将整个结构写入磁盘,然后再次读取它们。您将遇到不同体系结构的问题,正如您所注意到的,指针和可变长度数据结构。相反,在输出时手动封送数据,并在读取数据时将其放回一起
在您的特定情况下,您不需要编写结构日志记录,而是需要编写三件事:
- 偏移量
(选择大小和字节顺序并坚持)
(格式同上)数据的长度
数据的实际字节数
偏移量
,并重新排列其字节以匹配本地字节顺序。然后读取长度(与偏移量的读取方法相同)。现在您知道数据有多大了
,只需调用fread
,就可以分配内存并将其从磁盘上清除
哦,不要强制转换malloc的返回值,不需要它,它可以隐藏问题。相反,只要说:
/* See above for how to figure out data_length. */
t.data = malloc(sizeof(char) * data_length);
@Donotalo.很抱歉,我没有得到you@mu太短了:我建议的不是编辑!谢谢你指出我的错误。我要编辑。@mu太短:选中。:)
/* See above for how to figure out data_length. */
t.data = malloc(sizeof(char) * data_length);