c - 如何 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 数组。它必须是一个整数。
解决方案
如果要以文本形式添加:
fprintf(fp, "%d,\"%s\"\n", object -> class_id, object -> title);
当您使用“w”打开文件时,您会创建新的空文件。当您写入文件时,您确实需要 fseek。
如果要附加到现有文件,请改用“a”或“a+”。
推荐阅读
- php - 授予所有权限不适用于 PHP [MySQL]
- python - 在python中制作时间序列数据的相关图
- excel - VBA 中的 Powershell 命令
- graphql - Schema 必须包含名为“Project”的唯一命名类型
- javascript - 我的自定义 React 钩子在无限循环中被调用
- python - 编辑属性而不转义字符
- r - 是否可以根据注释而不是聚类结果为 kmeans 结果着色?
- c - 与挂在 C 中读取的子进程的通信
- ios - 从两个api中获取值到两个不同的Observable中并执行一些操作
- rust - 我可以将 RMPV `Value` 发送回 rmp_serde 进行反序列化吗?