我有一个包含记录的二进制文件。文件的结构如下:
结构(见下文) 名称字符串 地址字符串
有问题的结构:
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)
所以显然我做错了什么。有人可以给我一些帮助吗?
答案 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);