首页 > 解决方案 > 如何 fwrite() 结构中的两种不同类型的变量?

问题描述

我想将一个类型为“struct classes”(定义如下)的数组添加到文件中。例如,如果allClasses[0].title等于“数学”并且allClasses[0].class_id等于 1,我希望文件具有以下输入:

1Math/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

如果添加了另一个标题为 Science 的课程,那么文件现在应该是

1Math/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/02Science/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

似乎发生的情况是,尽管代码将捕获结构的 char 数组部分(示例中的数学/科学),但它会遇到 int 问题,而是在其位置打印出垃圾(垃圾通常是长于 1 个字符/1 个 int 长)。

根据经验,代码格式(当然有一些调整)在使用带有仅 char 数组变量的结构时工作得很好。但是,在使用整数时会出现故障。这是因为 ASCII 转换,还是类似的原因?如何调整代码以便同时获得 int 和 char 数组的输入?

void addClasses(char *given_title) {

FILE *fp;
fp = fopen("classes.db", "r");

if (numClasses == 0 && fp != NULL) {
    findClasses();
}

strcpy(allClasses[numClasses].title, given_title);
allClasses[numClasses].class_id = numClasses + 1;
numClasses++;

fclose(fp);

fp = fopen("classes.db", "w");

for (int i = 0; i < numClasses; i++) {
    struct classes *object = malloc(sizeof(struct classes) - 1);
    memset(object, 0, sizeof( struct classes ));

    object->class_id = allClasses[i].class_id;
    strcpy(object->title, allClasses[i].title);

    fseek(fp, numClasses * (sizeof(struct classes) - 1), SEEK_END);
    fwrite(object, sizeof(struct classes) - 1, 1, fp);
}
fclose( fp );
}

结构:

struct classes {
   int class_id;
   char title[30];
};

代码中某些组件的一些额外(可能是不必要的)背景:方法开头的位尝试读取文件并开始使用在开始之前已放入文件中的任何结构填充数组程序。我没有包括代码,因为即使我有一个新的 classes.db 文件(因此,即使findClasses()从未运行)也会发生上述故障。

顺便说一句:我无法将 class_id 更改为 char / char 数组。它必须是一个整数。

标签: cstructfwrite

解决方案


如果要以文本形式添加:

fprintf(fp, "%d,\"%s\"\n", object -> class_id, object -> title);

当您使用“w”打开文件时,您会创建新的空文件。当您写入文件时,您确实需要 fseek。

如果要附加到现有文件,请改用“a”或“a+”。


推荐阅读