0

バイナリの読み取り/書き込みを試みた後、惨めに失敗しました。fscanfとfprintfで同じことを試みましたが、正常に機能しているように見えましたが、繰り返しますが、読み取りがまったく機能せず、理由がわかりません。

構造体+ポインタ:

typedef struct flug
{
    int         flugnummer;
    char        flugziel[50];
    enum TAG    flugtag;
    int         flugzeit_stunde;
    int         flugzeit_minute;
    int         gateway;
    char        status[10];
    struct flug *next;
}FLUG;

typedef FLUG *ELEM_ZGR;

グローバル変数:

enum TAG {
Sonntag,
Montag,
Dienstag,
Mittwoch,
Donnerstag,
Freitag,
Samstag
};

static ELEM_ZGR first;
char const datei[] = "ddslist.txt";

書きます:

int fluege_sichern() {
ELEM_ZGR curr;
FILE *fp;

curr = first;

    if (fopen_s(&fp, datei,"a+") != 0)
    {
        printf("\nDatei %s nicht zum Anhaengen zu oeffnen",datei);
        PAUSE;
        exit(1);
    }

    while (curr != NULL) {
        fprintf(fp,"%d %s %d %d %d ",
            curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway);
        fclose(fp);

        curr = curr->next;
    }

}

読む:

void fluege_laden() {
ELEM_ZGR curr;
FILE *fp;

int i = 0;
curr = NULL;

    if (fopen_s(&fp, datei,"r") != 0)
    {
        printf("\nDatei %s nicht zum Lesen zu oeffnen",datei);
        PAUSE;
        exit(1);
    }

    printf("\n\nArtikelliste\nArtikelnummer  Artikelbezeichnung  Artikelpreis");

    while (fscanf_s(fp,"%d %s %d %d %d ",
            &curr->flugnummer, curr->flugziel, &curr->flugzeit_stunde, &curr->flugzeit_minute, &curr->gateway) != EOF)
    {
           printf("\n%d %s %d %d %d ",
            curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway);
           if (++i%10==0)
               PAUSE;
    }

    fclose(fp);
}

ここで私を助けてください。少しのヒントでも大きな助けになります。[編集1]

void fluege_laden() {
ELEM_ZGR curr;
FILE *fp;

int i = 0;
curr = (ELEM_ZGR)malloc(sizeof(struct flug));

    if (fopen_s(&fp, datei,"r") != 0)
    {
        printf("\nDatei %s nicht zum Lesen zu oeffnen",datei);
        PAUSE;
        exit(1);
    }

    printf("\n\nArtikelliste\nArtikelnummer  Artikelbezeichnung  Artikelpreis");

    while (fscanf_s(fp,"%d %s %d %d %d ",
            &curr->flugnummer, curr->flugziel, &curr->flugzeit_stunde, &curr->flugzeit_minute, &curr->gateway) != EOF)
    {
           printf("\n%d %s %d %d %d ",
            curr->flugnummer, curr->flugziel, curr->flugzeit_stunde, curr->flugzeit_minute, curr->gateway);
           if (++i%10==0)
               PAUSE;
    }

    fclose(fp);
}
4

2 に答える 2

1

見て:

void fluege_laden() {
  ELEM_ZGR curr;
  FILE *fp;

  int i = 0;
  curr = NULL;  /* NULL! */

ロード時currは ですNULL。ポインターに書き込むことはできませんNULL。これは未定義の動作です。メモリを割り当てる必要があります。

また、にポインターを含めないことtypedefを検討してください。これがポインターであることを理解して覚えておくのは困難ELEM_ZGRです。C ではポインターのセマンティクスが重要です。何が起こっているのかをコードのすべての読者に明確にすることが最善です。

于 2012-11-28T13:37:33.040 に答える
0

読み取り関数currでは、 への typedef がありFLUG *、次のように初期化しましたNULL

curr = NULL;

次に、次のようにして参照にアクセスしようとしますfscanf

while (fscanf_s(fp,"%d %s %d %d %d ", &curr->flugnummer,...

それは良くないね。ポインターがあり、それに何かを保存したい場合は、メモリーを与える必要があります。

curr = malloc(sizeof(FLUG));

そしたら使えるようになるはずです。完了したらfree(curr)、そのメモリも解放するために呼び出す必要があります。

于 2012-11-28T13:47:26.190 に答える