Stringverarbeitung/Textverarbeitung



  • [Rewind] schrieb:

    Hier müsstest du allerdings die Spezialfälle wie äöü beachten.

    Die kommen in dem zu suchenden Wort nicht vor.



  • Das ist mir schon klar - deswegen war's auch nur ein Hinweis (im Konjunktiv).



  • Also ich kann iwie nix mit der seite anfangen. ich bin anfänger in info und finde die seite hat schon ein paar sehr komplexe sachen enthalten.

    geht das nicht auch einfacher?

    also das die großen buchstaben kleingeschrieben werden? oder gibt es eine andere methode das zu machen?

    danke



  • #include <iostream>
    #include <algorithm>
    #include <cctype>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	cout << "please enter filename: " << endl;
    	string filename;
    	getline(cin, filename); // Dateiname eingeben. getline, dass auch Whitespaces eingegeben werden können.
    
    	ifstream file( filename.c_str() );
    	if( !file.is_open() ) // Programm beenden, falls Textdatei nicht geöffnet werden konnte.
    	{
    		cerr << "could not open file";
    		return -1;
    	}
    
    	file.seekg (0, ios::end); // Zeiger auf das Ende der Textdatei setzen, um die Größe ermitteln zu können.
        const unsigned size = file.tellg(); // Größe der Textdatei ermitteln.
        file.seekg (0, ios::beg); // Größe wurde ermittelt, nun den Zeiger wieder auf den Anfang der Textdatei setzen.
    
        string str;
        str.resize(size); // Speicher für insg. 'size' Zeichen reservieren.
        file.read(&str[0], size); // Inhalt der Textdatei im String abspeichern.
    
    	transform(str.begin(), str.end(), str.begin(), tolower); // Der String soll nur noch Kleinbuchstaben enthalten.
    
    	const string search = "zahn"; // Suchwort = zahn
    	unsigned occurrence = 0; // Zählt, wie oft das Suchwort im String vorkommt.
    
    	for(unsigned i=0; i<str.size(); i+=search.size())
    	{
    		i = str.find(search, i); // String nach dem Suchwort durchsuchen.
    		if( i==string::npos) // Abbruch, falls das Suchwort im String gar nicht vorkommt.
    			break;
    		++occurrence; // Suchwort wurde gefunden. Counter um 1 erhöhen.
    	}
    
    	cout << search << " was found: " << occurrence << 'x'; // Ergebnis aussgeben.
    }
    


  • Also den Anfang des Quellcodes versteh ich ja, aber wofür brauche ich den Zeiger auf das Ende und wofür die Größe?

    file.seekg (0, ios::end); // Zeiger auf das Ende der Textdatei setzen, um die Größe ermitteln zu können.
    const unsigned size = file.tellg(); // Größe der Textdatei ermitteln.
    file.seekg (0, ios::beg); // Größe wurde ermittelt, nun den Zeiger wieder auf den Anfang der Textdatei setzen.

    Versteh ich das richtig, das ich dann die komplette text-datei in einen string setzte?

    string str;
    str.resize(size); // Speicher für insg. 'size' Zeichen reservieren.
    file.read(&str[0], size); // Inhalt der Textdatei im String abspeichern.

    Wofür ist dann das :

    transform(str.begin(), str.end(), str.begin(), tolower); // Der String soll nur noch Kleinbuchstaben enthalten.

    Vielen Dank.



  • rob c++ schrieb:

    Also den Anfang des Quellcodes versteh ich ja, aber wofür brauche ich den Zeiger auf das Ende und wofür die Größe?

    file.seekg (0, ios::end); // Zeiger auf das Ende der Textdatei setzen, um die Größe ermitteln zu können.
    const unsigned size = file.tellg(); // Größe der Textdatei ermitteln.
    file.seekg (0, ios::beg); // Größe wurde ermittelt, nun den Zeiger wieder auf den Anfang der Textdatei setzen.

    Versteh ich das richtig, das ich dann die komplette text-datei in einen string setzte?

    Wenn du eine Datei öffnest, gibt es einen Zeiger. Dieser zeig auf das erste Zeichen der Datei (Position=0). Mit ios::end setzt du den Zeiger auf das letzte Zeichen der Datei (Position=Dateigröße). tellg() gibt die Position des Zeigers zurück. Da er auf dem Ende steht ist das dann die Dateigröße. Genau, die komplette Textdatei befindet sich dann in dem String.

    rob c++ schrieb:

    Wofür ist dann das :

    transform(str.begin(), str.end(), str.begin(), tolower); // Der String soll nur noch Kleinbuchstaben enthalten.

    Wie es der Name schon sagt, wird etwas transformiert. Die ersten beiden Paramter bezeichnen den Bereich, der transformiert werden soll (der gesamte String). Der dritte Parameter sagt, wo das transformierte Etwas abgespeichert werden soll (fortlaufend gebinnend beim Stringanfang). Ja und der vierte Parameter sagt einfach, wie transformiert werden soll (tolower=kleinbuchstaben).



  • Aber speicher ich die größe erst in eine Variable:
    const unsigned size = file.tellg();

    Dann deklarier ich die String variable str (wo der text nachher reinkopiert wird? wanngeschieht das? Bedeutet resize = reservieren?
    Also ich übergebe den file (die textdatei) an den str mit &str[0] sowie die anzahl size.

    string str;
    str.resize(size); // Speicher für insg. 'size' Zeichen reservieren.
    file.read(&str[0], size);

    Danach transformier ich den str von anfang bis ende in kleinbuchstaben.

    Zudem deklarier ich das Suchwort und den Zähler.

    Jedoch hab ich noch ein Problem mit der Schleife. im Schleifenkopf steht ja
    anweisung ab i=0 durch den string bis das ende gefunden wird.
    Jedoch was genau soll i+=search.size() bedeuten. Soll es heißen er geht alle Buchstaben durch? also so wie i++?

    for(unsigned i=0; i<str.size(); i+=search.size())
    {
    i = str.find(search, i); // String nach dem Suchwort durchsuchen.
    if( i==string::npos) // Abbruch, falls das Suchwort im String gar nicht vorkommt.
    break;
    ++occurrence; // Suchwort wurde gefunden. Counter um 1 erhöhen.
    }

    Du kannst ja richtig gut info, da bin ich ja ein anfänger dagegen.

    Vielen Dank



  • Vllcht darf ich den Tipp geben deinen code mit [/cpp][cpp] einzubinden. Einfach unten einmal klicken auf die passende Sprache Code rein und wieder drauf klicken. 🙂
    Dann kann man deine posts einfacher lesen. 🙂
    LG Enno



  • Danke für den Tipp!

    Aber speicher ich die größe erst in eine Variable:

    const unsigned size = file.tellg();
    

    Dann deklarier ich die String variable str (wo der text nachher reinkopiert wird? wanngeschieht das? Bedeutet resize = reservieren?
    Also ich übergebe den file (die textdatei) an den str mit &str[0] sowie die anzahl size.

    string str; 
    str.resize(size); // Speicher für insg. 'size' Zeichen reservieren. 
    file.read(&str[0], size);
    

    Danach transformier ich den str von anfang bis ende in kleinbuchstaben.

    Zudem deklarier ich das Suchwort und den Zähler.

    Jedoch hab ich noch ein Problem mit der Schleife. im Schleifenkopf steht ja
    anweisung ab i=0 durch den string bis das ende gefunden wird.
    Jedoch was genau soll i+=search.size() bedeuten. Soll es heißen er geht alle Buchstaben durch? also so wie i++?

    for(unsigned i=0; i<str.size(); i+=search.size()) 
    { 
    i = str.find(search, i); // String nach dem Suchwort durchsuchen. 
    if( i==string::npos) // Abbruch, falls das Suchwort im String gar nicht vorkommt. 
    break; 
    ++occurrence; // Suchwort wurde gefunden. Counter um 1 erhöhen. 
    }
    

    Du kannst ja richtig gut info, da bin ich ja ein anfänger dagegen.

    Vielen Dank



  • Zunächst wird der gesamte Inhalt in einen std::string gelesen. Damit das so einfach geht, wird erst die Dateigröße ermittelt. Anschließend werden so viele Bytes gelesen wie die Datei groß ist. Damit ist der gesamte Dateiinhalt im std::string.

    Die Schleife beginnt bei 0 (also dem ersten Zeichen) und endet bei str.size(), also beim Ende des std::string. Dieser std::string stellt einige Funktionen bereit, die einem das Leben etwas einfacher machen.

    Unter anderem bietet es auch find an, was nach dem Vorkommen einer Zeichenkette sucht. Der zweitere Parameter gibt an, wo begonnen werden soll zu suchen. Es wäre hier dumm jedes Mal am Anfang anzufangen. Wurde die Zeichenkette gefunden gibt find die Position zurück, wo die Zeichenkette gefunden wurde. Wurde die Zeichenkette nicht gefunden wird std::string::npos zurückgegeben. Sollte die Zeichenkette also nicht gefunden worden sein, wird die Schleife mit break verlassen. Die Suche ist beendet.

    Wurde hingegen etwas gefunden, wird die Anzahl erhöht und die Variable i wird um die Länge der zu suchenden Zeichenkette erhöht. Bei Zahn wäre das 4.

    Du kannst dir auch Debugausgaben hinzufügen, wo du z.B. mal die Positionen ausgeben lässt, etc.


Anmelden zum Antworten