从二进制文件中读取非固定长度(C)

时间:2013-03-06 08:55:40

标签: c binary

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

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

COURSECODE;COURSENAME;MAXAPPLICANTS;ACTUALAPPLICANTS;

我可以使用char*在文件中写这个没有任何问题。

我的问题是:如果记录是非固定大小,我如何在结构中读回? (例如:coursename可以是线性代数或分析 - >长度是未确定的)我还需要修改实际的申请人号码,如何找到它的字符位置和当前行?

我对这些想法感到满意,我也很感激任何源代码,我用C ++编程,C对我来说是一个艰难的退步。

提前谢谢!

4 个答案:

答案 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);