【问题标题】:Struct to file in C结构在 C 中归档
【发布时间】:2020-04-15 11:42:33
【问题描述】:

我有这个结构:

typedef struct{
  char name[MAXSTRING]; //MAXSTRING is defined above
  int id;
}student;

还有这个student st,我在其中保存了一个名字和一个ID。

我还加载了一个文件:student *stArray = load(argv[1]); //load() 是我打开文件的函数。

现在我想在这个函数中将st的内容添加到stArray中:

int addStudent(student st, student *stArray); //It's supposed to insert an entry

但我不知道怎么做。有人可以帮忙吗?

student *load(char *filename){

    FILE *fp = fopen(filename, "ab+");
    if (fp == NULL)
    {
        printf("File does not exist\n");
        abort();
    }
    
    student *students;

    fseek(fp, 0, SEEK_END);
    long fileSize = ftell(fp);
    if (fileSize == 0)
    {
        return NULL;
    }
    
    int numStudents = fileSize/sizeof(student);
    students = (student *)malloc(sizeof(student)*numStudents);
    if (students == NULL)
    {
        printf("Error allocating memory\n");
        abort();
    }
    
    return students;
}

【问题讨论】:

  • load究竟做了什么?源代码最好。命名表明它加载文件并返回一个学生记录数组,显然它不会这样做,因为在这种情况下工作会完成。
  • 不清楚你想让addStudent做什么。替换程序内存中数组中的一个条目?插入或附加条目,使数组更长?对文件进行一些更改或创建一个新文件?
  • 需要以读取方式打开文件,然后读取。

标签: c file struct


【解决方案1】:

我想将st的内容添加到stArray中

要在已创建的数组中添加新学生,只需使用 realloc 增加其大小,然后在其末尾复制新学生。

但是拥有那个签名是不可能的

int addStudent(student st, student *stArray);

因为:

  1. 你不知道当前数组的大小

  2. 你没有办法返回新数组

您需要在参数中接收数组的大小或它记住的学生人数

要返回新数组,您可以返回其地址:

student * addStudent(student st, student *stArray, size_t size);

或使用双指针:

int addStudent(student st, student ** stArray, size_t size);

但是返回新大小似乎也是合理的,否则调用者必须更新它,所以第二种解决方案可能是最好的,返回值可以是新大小,否则也使用 size:

int addStudent(student st, student ** stArray, size_t * size);

并且返回值可以用来指示realloc是否可行。

注意我上面考虑的 stArray 不是 st 可以安全 复制的地址,因为名称包含“add”而不是例如 'setStudent' 或 'saveStudent' 等,也因为函数返回一个必须有意义的值。但如果是这种情况,只需执行 memcpy(stArray, st, sizeof(st)); 并且我真的不知道返回值的兴趣,所以我无法建议返回什么。


关于您的代码的一些评论:

  • 函数load根本不加载文件,它只分配一块内存并返回未初始化的内存

  • 模式“ab+”不允许你读取文件内容,你需要使用“rb”(看来你需要'b')

  • 1234563并且您无权创建它,但您没有说明所有其他可能的原因,不要假设问题是什么,例如使用 perror
  • 你永远不会fclose文件,你需要这样做

  • 我希望你的文件是二进制文件,我的意思是所有字段必须有一个恒定的大小,否则你计算里面的元素数量是错误的。

  • 函数 load 必须返回数组的地址它的大小或里面的学生数量,以便以后添加新学生返回数组

【讨论】:

  • 签名是老师给的,不知道要不要改
  • @SpyrosMouchlianitis 显然签名不允许添加新学生,你能联系他谈谈吗?此外,您在哪里添加新学生?我想在我的答案最后,因为这是更便宜
  • @SpyrosMouchlianitis 我编辑了我的答案,以防 addStudent 只是做了一个 memcpy 但我不相信
  • 感谢您的帮助。谢天谢地,我的截止日期很长,所以我希望我能弄明白。
【解决方案2】:

我尝试了一种不同的方法,它奏效了。感谢大家的帮助。我认为这个问题不会帮助任何人。不要浪费你的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多