我是新来的,我需要一些帮助。 :)
我正在开发一个必须编写和读取二进制文件的程序。我必须添加讲座,它们看起来像:
COURSECODE;COURSENAME;MAXAPPLICANTS;ACTUALAPPLICANTS;
我可以使用char*
在文件中写这个没有任何问题。
我的问题是:如果记录是非固定大小,我如何在结构中读回? (例如:coursename可以是线性代数或分析 - >长度是未确定的)我还需要修改实际的申请人号码,如何找到它的字符位置和当前行?
我对这些想法感到满意,我也很感激任何源代码,我用C ++编程,C对我来说是一个艰难的退步。
提前谢谢!
答案 0 :(得分:2)
您的结构看起来像
struct student {
char *coursecode;
char *coursename;
char *max_applicants;
char *actual_applicants;
};
只需在您的结构中添加另一个成员,然后说int size
,它存储结构的总大小。
每次从二进制文件中读取时,您应首先阅读4 bytes
,您将获得完整的记录大小,然后查看记录中有多少个字符,读取那么多并按;
标记字符串你会找到你的记录。
答案 1 :(得分:0)
没有终止字符是不可能的。
如果您将某些角色专用于拆分数据,则可能。
例如,3个字符串可以通过\ 0来区分。所以你要读到\ 0,三次。答案 2 :(得分:0)
您可以将文件读入char*
缓冲区,然后用;
(字符串终止字符)替换任何\0
,最后将字段开头的指针指向您的结构:
struct student {
char *coursecode;
char *coursename;
char *max_applicants;
char *actual_applicants;
};
您可能希望先使用atoi
解析数字字段。
答案 3 :(得分:0)
建议#1:如果你是印地语并且你曾经重生,那么从学习C开始,然后转换到C ++。
建议#2:所以如果我理解正确的话,你连续有四个字符串,用分号分隔。然后你可以使用strtok_r()
拆分每一行并将文件的内容放在一个结构数组中(为清楚起见,省略了所有错误检查,但你肯定应该有一些):
typedef struct {
char *code;
char *name;
int max_appl;
int cur_appl;
} Course;
char buf[1024];
FILE *f = fopen("courses.txt", "r");
size_t size = 0;
size_t allocsize = 8;
Course *c = malloc(allocsize * sizeof(*c));
char *end;
while (fgets(buf, sizeof(buf), f) != NULL) {
if (size >= allocsize) {
allocsize <<= 1;
c = realloc(c, allocsize * sizeof(*c));
}
c[size].code = strdup(strtok_r(buf, ";", &end));
c[size].name = strdup(strtok_r(NULL, ";", &end));
c[size].max_appl = strtol(strtok_r(NULL, ";", &end), NULL, 10);
c[size].cur_appl = strtol(strtok_r(NULL, "\n", &end), NULL, 10);
size++;
}
int i;
for (i = 0; i < size; i++) {
Course *p = c + i;
printf("%s\n%s\n%d\n%d\n\n", p->code, p->name, p->max_appl, p->cur_appl);
free(p->code);
free(p->name);
}
free(c);
fclose(f);