我有一个文本文档,其中包含以下数据
$
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);
所以问题是如何使用循环将文本文件中的条目加载到结构中。
答案 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
)开始。 pStart
以NULL
开头。然后你有一个指向第一个条目的指针(即pp
指向pStart
。然后你开始循环。如果你找到$
,你就开始阅读。首先,您为新记录分配内存并设置*pp
指向该记录(请记住pp
指向pStart
,现在*pp
或pStart
指向然后,您可以扫描该记录。当您完成后,将pp
设置为指向当前记录的下一个指针(dalsi
)并循环。第二次迭代循环将填充pStart->dalsi
以指向下一条记录,因此您最终得到:
pStart ------> (record1) +---> (record2) +---> (record3)
\ dalsi ---+ \dalsi ---+ \dalsi --> NULL