Beispiel 7: Leseschleifen und Strukturen

16.01.2017 08:31 Uhr
#include <iostream>

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

struct element
   {
   int zahl;
   char name[64];
   char tags[10][64];
   } ;

void verarbeite(ifstream& datei);
void druckeelement(struct element *jetzt);

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

int main()
{
ifstream eingabe;
char dateiname[80];

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

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

verarbeite(eingabe);

eingabe.close();
}

void verarbeite(ifstream& datei)
{
char zeichen, letztes;
char puffer[100];
int zaehler;
enum zustand zustand = noise;

struct element *jetzt;

for (datei.get(zeichen);!datei.eof();datei.get(zeichen))
    {
    switch(zeichen)
       {
    case '<':
       zustand=direktive;
       zaehler=0;
       jetzt=new struct element;
       jetzt->zahl=0;
       break;
    case '>':
       if (zustand!=noise)
          {
	  if (letztes!=' ')
	     {
             puffer[zaehler]='\0';
             strcpy(jetzt->tags[jetzt->zahl],puffer);
	     jetzt->zahl++;
	     }
          druckeelement(jetzt);

	  }
       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:
          strcpy(jetzt->name,puffer);
	  zustand=abhaengig;
          break;
       case abhaengig:
          strcpy(jetzt->tags[jetzt->zahl],puffer);
	  jetzt->zahl++;

          break;
	  }
       break;
    default:
       if (zustand!=noise) puffer[zaehler] = zeichen;
       zaehler++;
       break;
       }
    letztes=zeichen;
    }
cout << endl;
}

void druckeelement(
struct element    *jetzt)
{
cout << endl << "Element " << jetzt->name << " enthält die Tags: ";

for (int i=0;i<jetzt->zahl;i++)
    {
    if (i>0) cout << ", ";
    cout << jetzt->tags[i];
    }
cout << ".";
}

Dateien: Beispiel 7

Schlagwörter: