Beispiel 9: fstream VIII

05.12.2016 11:31 Uhr
#include <iostream>

using namespace std;
#include <fstream>

int main()
{
char zeichen;
char puffer[100];
int zaehler;

ifstream eingabe;

eingabe.open("daten.xml");
for (zaehler=0;;)
    {
    eingabe.get(zeichen);
    if (eingabe.eof()) break;
    switch(zeichen)
       {
    case '<':
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Inhalt: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '>':
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Tag: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '\n':
       break;
    default:
       puffer[zaehler]=zeichen;
       zaehler++;
       break;
       }
    }
eingabe.close();
}

Beispiel 9: Erläuterungen I

#include <iostream>

using namespace std;
#include <fstream>

int main()
{
char zeichen;
char puffer[100];
int zaehler;

ifstream eingabe;
Eine sehr grundlegende Form Eingabe flexibel zu verarbeiten,
baut auf der Form einer Leseschleife auf, wie wir sie eben kennengelernt haben.
Zur Verdeutlichung im folgenden Programm nochmals die eigentliche Schleife in
roter Frabe:

eingabe.open("daten.xml");
for (zaehler=0;;)
    {
    eingabe.get(zeichen);
    if (eingabe.eof()) break;
    switch(zeichen)
       {
    case '<':
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Inhalt: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '>':
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Tag: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '\n':
       break;
    default:
       puffer[zaehler]=zeichen;
       zaehler++;
       break;
       }

    }
eingabe.close();
}

Beispiel 9: Erläuterungen II

#include <iostream>

using namespace std;
#include <fstream>

int main()
{
char zeichen;
char puffer[100];
int zaehler;

ifstream eingabe;

eingabe.open("daten.xml");
for (zaehler=0;;)
    {
    eingabe.get(zeichen);
    if (eingabe.eof()) break;
 XML Daten können in einfacher Form als ein Stom aus Einheiten zweier Arten
betrachtet werden: Tags - <x> ... </x> - und Inhalten, also dem
was zwischen einem Starttag '<x>' und dem folgenden Endtag '</x>'
steht.
   Wir stellen uns vor, daß wir ein Programm erzeugen wollen das je nachdem,
ob es ein Tag oder einen Inhalt liest unterschiedlich reagiert, aber beide
Arten von Information "sammelt" um sie als Zeichenketten ausgeben zu können.
Dann können wir in die grundlegende Schliefe die jetzt in blau gekennzeichnete
Konstruktion einsetzen um zwischen den angegebenen Situationen zu
unterscheiden. 

    switch(zeichen)
       {
    case '<':
Spitze Klammer auf; d.h., ein "Inhalt" wurde fertig
bearbeitet, ein neues "Tag" beginnt.
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Inhalt: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '>':

Spitze Klammer zu; d.h., ein "Tag" wurde fertig bearbeitet,
ein neuer "Inhalt" beginnt.
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Tag: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '\n':
Der Beginn einer neuen Zeile wird ignoriert, da er keine
Signifikanz für XML hat.
       break;
    default:

Alle anderen zeichen werden in einen Puffer geschrieben,
der jeweils das gerade in Bearbeitung befindliche "Tag", bzw. den gerade in
Bearbeitung befindlichen Inhalt aufnimmt.
       puffer[zaehler]=zeichen;
       zaehler++;
       break;
       }
    }
eingabe.close();
}

Beispiel 9: Erläuterungen III

#include <iostream>

using namespace std;
#include <fstream>

int main()
{
char zeichen;
char puffer[100];
int zaehler;
AlleZeichen werden in einen "Puffer" geschrieben.
Als Puffer bezeichnen wir Arrays, in denen Zeichen oder andere Information
angesammelt wird um sie dann "stückchenweise" zu verarbeiten. Beachten Sie
die weiteren braun ausgezeichneten Stellen des Programmes darauf, wie sie
die Verwendung des Puffers koordinieren.

ifstream eingabe;

eingabe.open("daten.xml");
for (zaehler=0;;)
Bevor das erste Zeichen verrabeitet ist, hat zaehler 
den Wert Null. Das nächste einzulesende Zeichen kommt an die Stelle 'Null'
des Puffers.
    {
    eingabe.get(zeichen);
    if (eingabe.eof()) break;
    switch(zeichen)
       {
    case '<':
       if (zaehler)

Wenn bei Antreffen eines Tag noch keine Zeichen im Puffer
stehen, kann man ihn auch nicht verarbeiten.
          {
          puffer[zaehler]='\0';
Sonst beenden wir die eingelesene Zeichenkette dadurch,
daß wir ein Stringendezeichen - "NUll" - ans Ende des Puffers schreiben.
          cout << "Inhalt: " << puffer << endl;
          zaehler=0;

Und setzen zaehler wieder auf Null - das erste Zeichen des
folgenden Tags soll ja wieder an die "nullte" Stelle.
          }
       break;
    case '>':
Analog zu oben.
       if (zaehler)
          {
          puffer[zaehler]='\0';
          cout << "Tag: " << puffer << endl;
          zaehler=0;
          }
       break;
    case '\n':
       break;
    default:

Alle anderen zeichen werden in die, durch 'zaehler'
fetsgehaltene, nächste freie Stelle des Puffers geschrieben.
       puffer[zaehler]=zeichen;
... und 'zahler' wird um eins höher gezählt, um auf die
nächste freie Stelle in Puffer zu verweisen.
       zaehler++;
       break;
       }
    }
eingabe.close();
}

Anhang: example9.zip

Schlagwörter: