使用周期和指针从文件读取到结构



我有一个文本documet,其中具有以下数据

$
osobny automobil
Ferrari
Autobazar Pestovatelska 4 Bratislava
68957
2012
udrziavane cervene dvojdverove
$
kamion
Renault magnum
AUTO Modranska 5 Senec
28000
2016
po havarii opraveny v dobrom stave
$
karavan
Kostitras
JANA, Vitanova 147
20250
2010
Voz na dovolenku

结构看起来像这样:

typedef struct auta {  
    char kategoria [50];  
    char znacka [50];
    char predajca [100];
    int cena;
    int rok_vyroby;
    char stav_vozidla [200];
    struct auta *dalsi;
}AUTA;

我应该做的事情是从该文件中读取printf条目数。例如,$将$计数为一个条目,因此总共将有三个条目。我发现,通过使用不同的结构指针进行输入来完成此条目非常愚蠢,但问题是我不知道如何制作明智的循环。到目前为止,我已经阅读了文件的第一个条目。

AUTA *p=NULL;
p=(AUTA*)malloc(sizeof(AUTA));
    fgets(z[0],5,fr);
    fgets(p->kategoria,50,fr);
    fgets(p->znacka,50,fr);
    fgets(p->predajca,100,fr);
    fscanf(fr,"%d",&p->cena);
    fscanf(fr,"%dn",&p->rok_vyroby);
    fgets(p->stav_vozidla,200,fr);

因此,问题将是如何使用循环将文本文件的条目加载到结构中。

我不确定这是什么语言,但是我假设达尔西(Dalsi)转换为下一步(如果不是,则在结构末尾添加 struct auta *next)。我也假设您是初学者,所以我会介绍我在下面做的一些事情:

AUTA *pStart = NULL;   // keep track of start of list:
AUTA **pp = &pStart;   // set a pointer to the pointer of the active entry
while (!feof(fr)) {
    fgets(z[0],5,fr);
    if (feof(fr))
           break;
    if (strcmp(z[0],"$") != 0) 
           continue;   // non $ sign -- not start of record... ignore line
    // allocate record:
    *pp = malloc(AUTA*)malloc(sizeof(AUTA))
    if (*pp == NULL) {   // double check that malloc succeeded
        sprintf(stderr, "Out of memoryn"); 
        exit -1;
    }
    // read in record -- note pp points to the pointer to the 
    // record, so you want to access (*pp)-> ...
    fgets((*pp)->kategoria,50,fr);
    fgets((*pp)->znacka,50,fr);
    fgets((*pp)->predajca,100,fr);
    fscanf(fr,"%d",&(*pp)->cena);
    fscanf(fr,"%dn",&(*pp)->rok_vyroby);
    fgets((*pp)->stav_vozidla,200,fr);
    (*pp)->dalsi = NULL;   // in case this is the last entry...
    pp = &(*pp)->dalsi;
}

此解决方案使用了双间接(指针指针),如果您是新手,这有点需要。我建议您绘制一个图表,如果您难以将其围绕它。基本上,我们从指向第一个记录的指针(pStart)开始。pStartNULL开头。然后,您将指向指向第一个条目的指针(即pp点指向pStart。然后开始循环。如果找到$,则开始阅读。首先,您将新记录分配为新记录并将*pp设置为Point对此(请记住,pp指向pStart,现在*pppStart点指向新记录。然后在该记录中扫描。完成后,将pp设置为当前记录的下一个指针(dalsi)和循环。循环的第二次迭代将填充pStart->dalsi,以指向下一个记录,因此您最终以:

 pStart ------> (record1)     +---> (record2)    +---> (record3)
                   dalsi  ---+       dalsi  ---+         dalsi --> NULL

最新更新