我有一个 struct employee
:
typedef struct employee
{
int name_length;
char* name;
float salary;
} Employee;
现在我想做一个雇员数组,并从二进制文件中获取每个雇员的姓名和工资。(二进制文件方案是这样建立的。6michel7544.564
(名字的长度,名字本身,工资)等等,雇员数量不详)。
我建立了这个函数来建立数组。
Employee** makeEmpArray(char* fname1, int* size)
{
FILE* empFile;
int k = 0;
Employee** arr; //array of employees
arr = (Employee**)malloc(sizeof(Employee*));
assert(arr != NULL);
empFile = fopen(fname1, "rb");
if (ferror(empFile))
{
printf("Error, cant open file");
exit(2);
}
while (!feof(empFile))
{
arr[k] = (Employee*)malloc(sizeof(Employee));
assert(arr[k]);
fread(&(arr[k]->name_length), sizeof(int), 1, empFile); // get length of name
arr[k]->name = (char*)malloc(arr[k]->name_length * sizeof(char)); //allocate memory for name in namelength size
assert(arr[k]->name!=NULL);
fread(arr[k]->name, sizeof(char), arr[k]->name_length, empFile); //read letter letter (namelen times)
fread(&arr[k]->salary, sizeof(float), 1, empFile); //reads floeat salary
k++;
arr = realloc(arr, (k + 1) * sizeof(Employee*)); //realloc for next employee
assert(arr != NULL);
}
fclose(empFile);
*size = k;
return arr;
}
除了名字的字符串之外,一切都很顺利!我得到的是 name_length
完美,我完美地得到了工资,不知为什么这一行是有问题的。
fread(arr[k]->name, sizeof(char), arr[k]->name_length, empFile);
名字没有从文件中读取 没有任何错误提示,而当我观看 arr[k]->name
调试时我看到 <invalid characters in string.>
希望您能帮我找出问题所在!
我没有试过我的想法,但我认为你应该为名字字符串末尾的/0额外malloc-ate一个char。此外,你应该清除刚刚分配的字符串内存。但我是一种猜测。