如何在结构中fwrite()两种不同类型的变量?

时间:2019-05-12 11:27:25

标签: c struct fwrite

我想在文件中添加一个类型为'struct classes'的数组(下面定义)。例如,如果allClasses[0].title等于“ Math”并且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

如果添加带有科学标题的其他课程,则该文件现在应显示为

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

似乎发生的是,尽管代码将捕获struct的char数组部分(在示例中为数学/科学),但它在处理int时会遇到麻烦,而是在其位置打印出垃圾(以及垃圾)通常比1个字符/ 1个int长)。

根据经验,当使用仅带有char数组的变量的结构时,代码格式(当然要进行一些调整)可以很好地工作。但是,使用int时会出现故障。这是因为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数组。它必须是一个int。

1 个答案:

答案 0 :(得分:1)

如果要以文本形式添加它:

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

当您使用“ w”打开文件时,将创建新的空文件。当您写入文件时,您需要进行查找。

如果要追加到现有文件,请使用“ a”或“ a +”代替。

相关问题