3

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

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

有问题的结构:

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 变量,malloc 足够的内存供名称放置,然后将名称读取到变量中。

像这样:

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)

所以很明显我做错了什么。有人可以给我一些帮助吗?

4

2 回答 2

2

我看到写入有两个问题,您将 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';
于 2010-03-07T20:06:29.907 回答
1

问题是你将指针传递给char*你的 fwrite :

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

这意味着您不是写名字,而是写名字的内存地址。Fwrite期望一个指向要写入的数据的指针-在您的情况下,这是指向char数据的指针,而不是指向数据指针的指针char

通过它record.name而不是&record.name你应该设置:

fwrite(record.name, sizeof(char), record.nameLength, fp);
于 2010-03-07T19:59:52.930 回答