1

我是新来的,我需要一些帮助。:)

我正在开发一个必须写入和读取二进制文件的程序。我必须向它添加讲座,它们看起来像:

COURSECODE;COURSENAME;MAXAPPLICANTS;ACTUALAPPLICANTS;

我可以将它写在一个文件中,使用char*.

我的问题是:如果记录的大小不固定,我如何在结构中读回它?(eg: coursename 可以是 Linear Algebra 或 Analysis -> length is undetermined) 我还需要修改实际的申请号,如何找到它的字符位置和当前行?

我会很高兴有想法,我也会欣赏任何源代码,我是用 C++ 编程的,而 C 对我来说是一个艰难的后退。

先感谢您!

4

4 回答 4

2

你的结构看起来像

struct student {
char *coursecode;
char *coursename;
char *max_applicants;
char *actual_applicants;
};

只需将另一个成员添加到您的结构中,说明int size哪个存储结构的总大小。

每次从二进制文件中读取时,您应该首先读取4 bytes记录的完整大小,然后查看记录中有多少字符,读取多少字符并标记字符串,;您将找到您的记录。

于 2013-03-06T09:26:23.597 回答
0

没有终止字符是不可能的。

如果您专用一些字符来拆分数据,那么它是可能的。

例如,可以通过 \0 来区分 3 个字符串。所以你读到\0,三遍。

于 2013-03-06T08:59:13.723 回答
0

您可以将文件读入char*缓冲区,然后;\0(字符串终止字符)替换任何内容,最后将字段开头的指针放入结构中:

struct student {
    char *coursecode;
    char *coursename;
    char *max_applicants;
    char *actual_applicants;
};

您可能希望首先解析数字字段atoi

于 2013-03-06T09:02:06.813 回答
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);
于 2013-03-06T09:16:57.950 回答