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
很可能不包含有效的
浮点表示形式。