/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Struktur af givne data - automatisk/manuel~
Fra : Bertel Lund Hansen


Dato : 08-08-03 11:00

Hej alle

Konkret drejer det sig om at jeg skal aflæse headere i
usenetindlæg, men problemet er generelt.

Jeg kan naturligvis teste nede i koden:

   if (strstr(linje,"From:")) read_fromheader();

Men det vil jo give 30+ søgninger med strstr() af den samme
streng.

Min tidligere løsning bestod i at gemme headertitlerne i et array
og så referere til dem med numre. Så kunne testen lægges i en
switch:
   switch (headernr) {
    case FROM: read_fromheader(); break;
    osv.
   }

Men det kunne jeg kun klare ved at opdatere nummerlisten manuelt:

// Headers:
enum { // Møgløsning - manuel opdatering.
FROM = 0,
NEWSGROUP = 2,
MSGID = 4,
PATH = 5,
};

const char
*headernames[] = {
// Required:
"from:",
"date:",
"newsgroups:",
"subject:",
"message-id:",
"path:",
};

Så tænkte jeg på at jeg i initdelen kunne lave en struktur der
læste headernames[] igennem og så tildelte nummerværdier til de
tilsvarende variable, men så er jeg jo tilbage ved begyndelsen.

Min første version får alle fasta data specificeret i C-filen,
men den færdige version kommer nok til at læse en inifil, så
løsninger til den fremgangsmåde er også velkomne.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

 
 
Anders Wegge Jakobse~ (08-08-2003)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 08-08-03 13:26

"Bertel" == Bertel Lund Hansen <nospamfor@lundhansen.dk> writes:

> Hej alle
> Konkret drejer det sig om at jeg skal aflæse headere i
> usenetindlæg, men problemet er generelt.

> Jeg kan naturligvis teste nede i koden:

>    if (strstr(linje,"From:")) read_fromheader();

> Men det vil jo give 30+ søgninger med strstr() af den samme
> streng.

> Min tidligere løsning bestod i at gemme headertitlerne i et array
> og så referere til dem med numre. Så kunne testen lægges i en
> switch:
>    switch (headernr) {
>     case FROM: read_fromheader(); break;
>     osv.
>    }

...

> Så tænkte jeg på at jeg i initdelen kunne lave en struktur der
> læste headernames[] igennem og så tildelte nummerværdier til de
> tilsvarende variable, men så er jeg jo tilbage ved begyndelsen.

> Min første version får alle fasta data specificeret i C-filen,
> men den færdige version kommer nok til at læse en inifil, så
> løsninger til den fremgangsmåde er også velkomne.

Er opgaven at matche de enkelte headere til en funktion, der
behandler den givne linie?

Du kan lave et array med den faste tekst og funktionen:

struct headerhandler {
const char *hh_type;
void (*hh_handler)(char *);
};

struct headerhandler[] = {
{"From:", read_fromheader},
...
}

Når du så skal parse en besked, metcher du de enkelte headerlinier
med hh_type, og når du har et match, kalder du *hh_handler().


--
/Wegge <http://outside.bakkelygaard.dk/~wegge/>

Bertel Lund Hansen (09-08-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-08-03 11:07

Anders Wegge Jakobsen skrev:

> Er opgaven at matche de enkelte headere til en funktion, der
>behandler den givne linie?

Ja.

> Du kan lave et array med den faste tekst og funktionen:

Altså basere det på funktionspointere.

Tak for ideen.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste