gpt4 book ai didi

c - C 中的 fread/fwrite 字符串

转载 作者:行者123 更新时间:2023-12-05 01:22:42 29 4
gpt4 key购买 nike

我有一个包含记录的二进制文件。文件结构如下:

结构(见下文)名称字符串地址字符串

有问题的结构:

typedef struct{
char * name;
char * address;
short addressLength, nameLength;
int phoneNumber;
}employeeRecord;
employeeRecord record;

我得到的名字是这样的:

char name[50];
printf("\nName:");
fgets(name,50,stdin);
record.nameLength = strlen(name)-1;
record.name = malloc(sizeof(char)*record.nameLength);
strcpy(record.name,name);

我写下结构、名称,然后是地址(如上所述)。

fwrite(&record.name,sizeof(char),record.nameLength,fp);

其中 fp 是一个文件指针。

现在我关闭文件。但是,如果我想从文件中读取以取回这些数据,我相信我需要读取结构,读取 nameLength 变量,为名称分配足够的内存,然后将名称 fread 到变量中。

像这样:

char *nameString = malloc(sizeof(char)*record.nameLength);
fread(nameString,sizeof(char),record.nameLength,fp);
printf("\nName: %s",nameString);

但是,当我尝试这样做时,我没有获得有效数据。示例:

Input name is: Joseph (6 characters)
Output data:
Name length is 6 (correct),
Name is �A � (aka garbage)

很明显我做错了什么。有人可以帮我吗?

最佳答案

我看到写入有两个问题,您将 record.nameLength 设置得太小,并且您将错误的指针传递给 fwrite 作为名称。 record.name 已经是一个指针。

改变这个

record.nameLength = strlen(name)-1;
...
fwrite(&record.name,sizeof(char),record.nameLength,fp);

对此

record.nameLength = strlen(name);
...
fwrite(record.name,sizeof(char),record.nameLength,fp);

您在读取时也有问题,因为您没有将字符串中的终止符\0 写入文件,当您回读时,您需要明确添加该终止符。

char *nameString = malloc(sizeof(char)* (record.nameLength + 1));
fread(nameString,sizeof(char),record.nameLength,fp);
nameString[record.NameLength] = '\0';

关于c - C 中的 fread/fwrite 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397707/

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