【问题标题】:C fscanf and pointerC fscanf 和指针
【发布时间】:2012-11-28 13:35:20
【问题描述】:

在尝试读/写二进制文件惨遭失败后,我尝试用 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);
}

【问题讨论】:

  • 我建议对函数使用有用的参数(而不是依赖全局变量),并让它们也返回有用的值。并且:请不要 typedef 指针。它只会让你和其他人感到困惑。 (对于有经验的人来说,'*' 比 FLUGZEUG_ANZEIGER_TYP 更具可读性;
  • 我会在应用程序按预期工作后立即执行此操作。 ;)

标签: c printing struct scanf printf


【解决方案1】:

看:

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

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

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

另外,考虑包括typedef 中的指针,很难理解和记住ELEM_ZGR 是一个指针。指针语义在 C 中很重要,最好让所有代码读者都清楚这是怎么回事。

【讨论】:

  • 嗯.. 好的,我明白了,但我不知道如何解决它。 curr = first 似乎也没有帮助。
  • 什么是第一?它是在某处定义的吗?初始化了吗?它指向有用的东西吗?
  • 啊抱歉,我并没有真正把它放在第一篇文章中。这是一个全局静态变量(将编辑第一篇文章并将其放入其中),但好吧..最后它也是空的。我该怎么做呢?我通常在 vb.net 中编程,似乎更容易处理。
【解决方案2】:

在您的读取函数中,currFLUG * 的 typedef,您将其初始化为 NULL

curr = NULL;

然后你尝试在你的fscanf 中访问它:

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

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

curr = malloc(sizeof(FLUG));

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

【讨论】:

  • 哦..是的,我忘记了,但它仍然不起作用。我要更新最初的帖子..
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2010-11-24
  • 2021-12-29
  • 2012-07-01
相关资源
最近更新 更多