C-从二进制文件读取字符串无效
我有一名结构员工:C-从二进制文件读取字符串无效,c,struct,binaryfiles,C,Struct,Binaryfiles,我有一名结构员工: typedef struct employee { int name_length; char* name; float salary; } Employee; 现在我想创建一个员工数组,并从二进制文件中获取每个员工的姓名和薪水。(二进制文件方案的构建方式如下:6michel7544.564(姓名长度、姓名本身、工资)等,员工人数未知) 我构建此函数是为了构建阵列: Employee** makeEmpArray(char* fname1, int*
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\u length
,我完美地获得了薪水,出于某种原因,这一行是有问题的:
fread(arr[k]->name,sizeof(char),arr[k]->name\u length,empFile)代码>
该名称不会从文件中读取。没有错误提示,当我观看arr[k]->name
调试时,我看到
希望你能帮我找出问题所在 我没有尝试我的想法,但我认为您应该在名称字符串末尾为\0多吃一个字符。此外,您应该清除刚刚分配的字符串内存。
但我有点猜测。我没有尝试我的想法,但我认为您应该在名称字符串末尾为\0多吃一个字符。此外,您应该清除刚刚分配的字符串内存。
但我有点猜测。无效字符出现在哪里?在正确的名字后面,比如“michel%$!”?您的名称
不是以null结尾的。再分配一个字符,然后将实际名称后面的字符设置为'\0'
。(我怀疑当你读不到名字时,你是否能正确地读到薪水。)@KamilCuk你如何解释这一点呢除了名字的字符串之外,一切都很顺利!!我的名字很长,薪水也很高,由于某种原因,这行代码有问题
?Michael,你能用@KamilCuk fix?@MacOS再试一次吗fread
不读取数字的10进制表示,它读取任何字节。OP应将表示数字的ASCII字符转换为本机表示。通常,这是通过scanf
完成的。产生的arr[k]->name
不是以零结尾的,name\u length
不等于6
,而是等于ASCII字符'6'
和arr[k]->salary
很可能不包含float
的有效表示形式。无效字符出现在哪里?在正确的名字后面,比如“michel%$!”?您的名称
不是以null结尾的。再分配一个字符,然后将实际名称后面的字符设置为'\0'
。(我怀疑当你读不到名字时,你是否能正确地读到薪水。)@KamilCuk你如何解释这一点呢除了名字的字符串之外,一切都很顺利!!我的名字很长,薪水也很高,由于某种原因,这行代码有问题
?Michael,你能用@KamilCuk fix?@MacOS再试一次吗fread
不读取数字的10进制表示,它读取任何字节。OP应将表示数字的ASCII字符转换为本机表示。通常,这是通过scanf
完成的。产生的arr[k]->name
不是以零结尾的,name\u length
不等于6
,而是等于ASCII字符'6'
和arr[k]->salary
很可能不包含有效的浮点表示形式。