gpt4 book ai didi

c - 将带有 char* 字符串的 C 结构保存到文件中

转载 作者:太空狗 更新时间:2023-10-29 17:07:03 25 4
gpt4 key购买 nike

我正在尝试将带有 char* 字符串的结构保存到文件中。

struct d_object {
int flags;
int time;
int offset;
char *filename;
};

问题是这样做时我显然只会保存该指针的地址而不是字符串。所以我所做的只是使用一个字符数组,但我不得不设置字符串的最大大小。这工作正常,但是我想知道是否有将结构与 char* (我在某个时候 malloc)存储在文件中然后检索它的方法。我可以将字符串和结构分开保存,然后检索它们,但这相当困惑。如果我可以将整个结构(上面的结构)加载并保存到文件中,那将是更好的选择。谢谢!

char 数组的代码如下:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>

struct d_object {
int flags;
int time;
int offset;
char filename[255];
};

int main(int argc, char **argv) {

struct d_object fcb;

fcb.flags=5;
fcb.time=100000;
fcb.offset=220;
strncpy(fcb.filename,"myfile",255);


int fd=open("testfile",O_RDWR);
write(fd,&fcb,sizeof(fcb));
close(fd);


int fd2 = open("testfile",O_RDONLY);
struct d_object new_fcb;
read(fd2,&new_fcb,sizeof(new_fcb));

printf("read from file testfile: %s\n",new_fcb.filename);

return 0;

}

P.S.:我没有使用 STREAM 函数只是因为这实际上意味着要在没有它们的嵌入式操作系统上运行。我刚刚为 *BSD/Linux 改编了代码,因此在提出问题时更有意义。

最佳答案

我知道可移植性不是问题,因为您正在为嵌入式系统工作。在其他情况下,您应该使用 XML 之类的东西。

您可以将代码转换回:

struct d_object {
int flags;
int time;
int offset;
char * filename;
};

然后分别保存每条数据:

write( fd, &record.flags, sizeof( int ) );
write( fd, &record.time, sizeof( int ) );
write( fd, &record.offset, sizeof( int ) );
int filename_length = strlen( filename );
write( fd, &filename_length, sizeof( int ) );
write( fd, record.filename, filename_length );

要阅读,您必须分别阅读每个项目,然后是文件名:

int filename_length;

read( fd, &emptyRecord.flags, sizeof( int ) );
read( fd, &emptyRecord.time, sizeof( int ) );
read( fd, &emptyRecord.offset, sizeof( int ) );

read( filename_length, sizeof( int ), 1, file );
emptyRecord.filename = (char *) malloc( sizeof( char ) * ( filename_length +1) );
read( fd, emptyRecord.filename, filename_length );
*( emptyRecord.filename + filename_length ) = 0;

关于c - 将带有 char* 字符串的 C 结构保存到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com