我一直在做这个作业,我需要读入“记录”并将它们写入文件,然后才能稍后读取/查找它们。在程序的每次运行中,用户可以决定写入一条新记录,或者读取一条旧记录(通过名称或#)
该文件是二进制文件,这是它的定义:
typedef struct{
char * name;
char * address;
short addressLength, nameLength;
int phoneNumber;
}employeeRecord;
employeeRecord record;
程序的工作方式,它将存储结构,然后是名称,然后是地址。名称和地址是动态分配的,这就是为什么需要先读取结构以找到名称和地址的大小,为它们分配内存,然后将它们读入该内存的原因。
出于调试目的,我目前有两个程序。我有我的文件写入程序和文件读取。
我的实际问题是,当我读取我编写的文件时,我读取了结构,打印出电话 # 以确保它工作正常(工作正常),然后读取名称(现在可以使用 record. nameLength 也报告了正确的值)。然而,Fread 不返回可用的名称,它返回空白。
我看到两个问题,要么我没有将名称正确写入文件,要么我没有正确读取它。这是我写入文件的方式:其中 fp 是文件指针。record.name 是一个合适的值,record.nameLength 也是如此。我也在写包含空终止符的名称。(例如“杰克\0”)
fwrite(&record,sizeof record,1,fp);
fwrite(record.name,sizeof(char),record.nameLength,fp);
fwrite(record.address,sizeof(char),record.addressLength,fp);
然后我关闭文件。这是我读取文件的方式:
fp = fopen("employeeRecord","r");
fread(&record,sizeof record,1,fp);
printf("Number: %d\n",record.phoneNumber);
char *nameString = malloc(sizeof(char)*record.nameLength);
printf("\nName Length: %d",record.nameLength);
fread(nameString,sizeof(char),record.nameLength,fp);
printf("\nName: %s",nameString);
请注意,那里有一些调试内容(名称长度和编号,两者都是正确的)。所以我知道文件正确打开,我可以很好地使用名称长度。那为什么我的输出是空白的,或者换行符,或者类似的东西?(输出只是名称:后面什么都没有,程序完成就好了)
谢谢您的帮助。