C-从二进制文件中读取字符串不工作。

问题描述 投票:1回答:1

我有一个 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.>enter image description here

希望您能帮我找出问题所在!

c struct binaryfiles
1个回答
0
投票

我没有试过我的想法,但我认为你应该为名字字符串末尾的/0额外malloc-ate一个char。此外,你应该清除刚刚分配的字符串内存。但我是一种猜测。

© www.soinside.com 2019 - 2024. All rights reserved.