使用循环和指针从文件读取到结构

时间:2017-11-29 18:30:21

标签: c

我有一个文本文档,其中包含以下数据

$
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,"%d\n",&p->rok_vyroby);
    fgets(p->stav_vozidla,200,fr);

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

1 个答案:

答案 0 :(得分:1)

我不确定这是什么语言,但我假设dalsi会转换为next(如果没有,请在结构的末尾添加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 memory\n"); 
        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,"%d\n",&(*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指向该记录(请记住pp指向pStart,现在*pppStart指向然后,您可以扫描该记录。当您完成后,将pp设置为指向当前记录的下一个指针(dalsi)并循环。第二次迭代循环将填充pStart->dalsi以指向下一条记录,因此您最终得到:

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