2. Begriffe aus Dateien auslesen
BegriffeDateienfinden1.cpp
// Begriffe in Dateien finden - Datei 1

# include <fstream>
# include <iostream>
# include <string>

using namespace std;

int main()
{
string daten;
string cpdaten;
int suche;

fstream readdatei("/Pfad/zur/Testdatei", ios::in);
while(readdatei >> daten)
{
suche = daten.find("suchbegriff");
if(suche!=-1)
{
cpdaten = daten.substr(0);
cout << "|" << cpdaten << "|" << endl;
}
}
readdatei.close();

return(0);
}

Die Daten im Detail:

fstream readdatei("/Pfad/zur/Testdatei", ios::in);
öffnet die Datei zum lesen (ios::in).
while(readprobe >> daten)
Durch die while-Schleife wird so lange in der Datei gelesen, bis das Ende der Datei erreicht ist, sozusagen, bis keine Daten mehr vorhanden sind. Die ausgelesenen Daten werden der String-Variablen daten übergeben. Mit diesem Verfahren werden keine ganzen Zeilen übergeben, sondern nur jeweils Zeichenketten (Strings). Die Trennung erfolgt durch das Leerzeichen.
suche = daten.find("suchbegriff");
mit find kann man nach dem Suchbegriff in den Daten suchen. Eigentlich liefert find als Rückgabewert die Position des Suchbegriffs in der String-Variable und übergibt diese der Ganzzahl-Variablen suche. Wird der gewünschte Begriff nicht gefunden, gibt find -1 zurück. In unserem Beispiel bekommt also die Ganzzahl-Variable suche entweder eine -1 wenn der Begriff nicht auf unser String paßt und eine positive Zahl, wenn der Suchbegriff im String vorkommt. Somit können wir in der nächsten Zeile den Wert abfragen:
if(suche!=-1)
wenn die Variable suche nicht -1 ist, der Suchbegriff also paßt, wird die if-Schleife ausgeführt.
cpdaten = daten.substr(0);
cout << "|" << cpdaten << "|" << endl;

mittels substr wird der String in der Variablen daten in den String cpdaten kopiert. In Klammern kann man den Startpunkt (hier 0, also vom Anfang des Strings), sowie die Länge angeben. Gibt man die Länge nicht an, wird einfach der komplette String kopiert. Mit cout gibt man die gefundenen Daten dann aus. Mal angenommen, unser Suchbegriff kommt inmitten eines Wortes vor und man möchte nur diesen kopieren, ist es auch möglich die Position mittels unserer Ganzzahl-Variablen suche anzugeben.
Dazu noch ein weiteres Programmbeispiel:

Angenommen wir haben eine Liste mit Adressdaten der Belegschaft in folgender Form:

Name: Max Mustermann
Straße: Baumallee 17
Wohnort: 88000 Musterdorf

und möchten uns jetzt sämtliche Namen dieser Liste ausgeben lassen, dann müssen wir unser obiges Programm wie folgt abändern:

BegriffeDateienfinden2.cpp
// Begriffe in Dateien finden - Datei 2

# include <fstream>
# include <iostream>
# include <string>

using namespace std;

int main()
{
string daten;
string cpdaten;
int suche;

fstream readdatei("/Pfad/zur/Testdatei", ios::in);
while(getline(readdatei,daten))
{
suche = daten.find("Name");
if(suche!=-1)
{
cpdaten = daten.substr(suche+6);
cout << cpdaten << endl;
}
}
readdatei.close();

return(0);
}

Wieder im Detail:

while(getline(readdatei,daten))
Mit dieser while-Schleife werden die Daten nicht mehr String-weise durch Leerzeichen getrennt eingelesen, sondern Zeilenweise.
suche = daten.find("Name");
if(suche!=-1)
Anschließend suchen wir nach dem Begriff Name um alle Namen der Belegschaft zu finden. Als Rückgabewert in suche erhalten wir die Position des ersten Zeichens unseres Suchbegriffs, also von Name als Ganzzahl. Darunter wieder wie gehabt die Abfrage, ob die Suche -diesmal pro Zeile- erfolgreich war.
cpdaten = daten.substr(suche+6);

Anschließend kopieren wir die Namen mit substr heraus. Dabei verwenden wir als Positionsangabe die Ganzzahl von suche plus 6 Zeichen, da unser Suchbegriff Name 4 Zeichen hat, plus dem Doppelpunkt, plus einem Leerzeichen. Da die Angabe der Länge fehlt, die komplette Zeile bis zum Ende. Als Ausgabe von cout erhalten wir:

Max Mustermann

Mit dieser Methode - den Rückgabewert von find an substr zu übergeben - ist es möglich nach Zeichen in Texten zu suchen und diese zu extrahieren.

readdatei.close();
Anschließend wird die mit fstream geöffnete Datei wieder geschlossen. Auch wenn die geöffnete Datei mit Beendigung des Programms geschlossen wird, sollte man sie immer korrekt mit dem close-Befehl schließen. Gerade bei Dateien die man nicht nur zum Lesen, sondern auch zum Schreiben öffnet, könnte dies sonst zu Datenverlust führen.
Index