我有一个文本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
)开始。pStart
以NULL
开头。然后,您将指向指向第一个条目的指针(即pp
点指向pStart
。然后开始循环。如果找到$
,则开始阅读。首先,您将新记录分配为新记录并将*pp
设置为Point对此(请记住,pp
指向pStart
,现在*pp
或pStart
点指向新记录。然后在该记录中扫描。完成后,将pp
设置为当前记录的下一个指针(dalsi
)和循环。循环的第二次迭代将填充pStart->dalsi
,以指向下一个记录,因此您最终以:
pStart ------> (record1) +---> (record2) +---> (record3)
dalsi ---+ dalsi ---+ dalsi --> NULL