Beispiel 6: Objekte und Rekursion

23.01.2017 08:31 Uhr
#include <iostream>

using namespace std;
#include <fstream>
#include <string.h>

#include "element6.h"

ClElement *verarbeite(ifstream& datei);

enum zustand {direktive, element, abhaengig, noise};

int main()
{
ifstream eingabe;
char dateiname[80];
ClElement *jetzt=NULL, *wurzel;

cout << "DTD-Dateiname: " << endl;
cin >> dateiname;
eingabe.open(dateiname);

if (!eingabe)
   {
   cout << "Die Datei konnte nicht geöffnet werden." << endl;
   return 1;
   }

wurzel=verarbeite(eingabe);

for (jetzt=wurzel;jetzt!=NULL;jetzt=jetzt->getNext())
    jetzt->druckeElement(0,wurzel);

eingabe.close();
}

ClElement *verarbeite(ifstream& datei)
{
char zeichen, letztes;
char puffer[100];
int zaehler;
enum zustand zustand = noise;
ClElement *jetzt=NULL, *wurzel, *neu;

for (datei.get(zeichen);!datei.eof();datei.get(zeichen))
    {
    switch(zeichen)
       {
    case '<':
       zustand=direktive;
       zaehler=0;
       break;
    case '>':
       if (zustand!=noise)
          {
	  if (letztes!=' ')
	     {
             puffer[zaehler]='\0';
	     jetzt->addTag(puffer);
	     }
	  }
       zustand=noise;
       break;
    case ' ':
       if (letztes==' ') continue;
       puffer[zaehler]='\0';
       zaehler=0;
       switch(zustand)
          {
       case direktive:
          if (strcmp(puffer,"!ELEMENT"))
	     {
	     cout << endl << "Diese Direktive verstehe ich nicht: " << puffer;
	     zustand=noise;
	     }
	  else zustand=element;
          break;
       case element:
          neu=new ClElement(puffer);
	  if (jetzt!=NULL) jetzt->setNext(neu);
	  else wurzel=neu;
	  jetzt=neu;
	  zustand=abhaengig;
          break;
       case abhaengig:
          jetzt->addTag(puffer);
          break;
	  }
       break;
    default:
       if (zustand!=noise) puffer[zaehler] = zeichen;
       zaehler++;
       break;
       }
    letztes=zeichen;
    }

return wurzel;
}

Element Bibliothek

#include <iostream>

using namespace std;
#include <string.h>

#include "element6.h"

ClElement::ClElement(
char                *string)
{
this->zahl=0;
strcpy(this->name,string);
this->naechstes=NULL;
}

void ClElement::addTag(
char                  *string)
{
strcpy(this->tags[this->zahl],string);
this->zahl++;
}

void ClElement::druckeElement(
int                           ebene,
ClElement                          *wurzel)
{
ClElement *abhaengig;

for (int j=0;j<ebene;j++) cout << "|   ";
cout << "Element " << this->name << " enthält die Tags: " << endl;
for (int i=0;i<zahl;i++)
    {
    for (int j=0;j<ebene;j++) cout << "|   ";
    cout << "   " << this->tags[i] << endl;
    abhaengig=sucheElement(this->tags[i],wurzel);
    if (abhaengig != NULL) abhaengig->druckeElement(ebene+1,wurzel);
    }
}

ClElement *ClElement::sucheElement(
char                              *suche,
ClElement                               *element)
{

while (element!=NULL)
   {
   if (!strcmp(suche,element->name)) break;
   element=element->naechstes;
   }

return element;
}

Dateien: Beispiel 6

Schlagwörter: