C中的fread / fwrite字符串

时间:2010-03-07 19:56:33

标签: c malloc fread fwrite

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

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

有问题的结构:

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)

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

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分:1)

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

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

这意味着您不是编写名称,而是编写名称的内存地址。 Fwrite期望指向数据的指针写入您的情况,这是指向char数据的指针,而不是指向char数据指针的指针。

传递record.name代替&record.name,您应该设置:

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