1

私はここに来たばかりで、助けが必要です。:)

バイナリファイルを読み書きする必要があるプログラムに取り組んでいます。それに講義を追加する必要があります。それらは次のようになります。

COURSECODE;COURSENAME;MAXAPPLICANTS;ACTUALAPPLICANTS;

を使用して問題なくファイルに書き込むことができましたchar*

私の質問は、レコードのサイズが固定されていない場合、構造体でそれを読み取るにはどうすればよいですか? (例: coursename は Linear Algebra または Analysis にすることができます -> 長さは未定です) また、実際の志願者数を変更する必要があります。その文字位置と現在の行を見つけるにはどうすればよいですか?

私はアイデアに満足し、ソースコードも同様に感謝します。私は 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 まで 3 回読みます。

于 2013-03-06T08:59:13.723 に答える
0

ファイルをchar*バッファに読み込み、任意のもの;\0(文字列終了文字) に置き換え、最後にフィールドの開始点のポインタを構造体に取り込むことができます。

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

atoi数値フィールドをfirstで解析したい場合があります。

于 2013-03-06T09:02:06.813 に答える
0

アドバイス #1: あなたがヒンディー語で生まれ変わった場合は、C を学ぶことから始めて、C++ に移行してください。

アドバイス #2: 私の理解が正しければ、セミコロンで区切られた 4 つの文字列が連続しています。次に、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 に答える