Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将包含字符串的结构写入二进制文件_C_Linux_Binaryfiles - Fatal编程技术网

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);