C fscanf和指针

时间:2012-11-28 13:35:21

标签: c printing struct scanf printf

尝试读取/写入二进制文件失败后,我试图用fscanf和fprintf做同样的事情,它似乎工作正常,但又一次......阅读根本不起作用再一次我无法分辨原因如下:

struct + pointer:

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);
}

请帮帮我。即使是一点点暗示也会是一个巨大的帮助。 [EDIT1]

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);
}

2 个答案:

答案 0 :(得分:1)

查找

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

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

加载时,currNULL。你不能写一个NULL指针,这是未定义的行为。你需要分配内存。

另外,考虑 not 包括typedef中的指针,很难理解并记住ELEM_ZGR是一个指针。指针语义在C中很重要,最好让所有读者清楚地知道正在发生的事情。

答案 1 :(得分:0)

在您的阅读功能中,currFLUG *的typedef,您将其初始化为NULL

curr = NULL;

然后,您尝试在fscanf

中访问deference
while (fscanf_s(fp,"%d %s %d %d %d ", &curr->flugnummer,...

这不好。如果你有一个指针,并且想要存储一些东西,你需要给它一些记忆:

curr = malloc(sizeof(FLUG));

然后你应该可以使用它。完成后,您还需要调用free(curr)来释放内存。