Buchstaben aus Textdatei zählen



  • hallo ich habe ein problem bei einem programm an dem ich gerade schreibe.
    ich soll aus einer textdatei alle buchstaben zählen und diese dann sortiert nach ihrer anzahl ausgeben. also z.b. buchstabe e:230, f:121, ... etc

    aber ich habe ein problem beim speichern der werte.
    das einlesen aller buchstaben aus dem text funktioniert einwandfrei
    ich speicher diese einzelnen buchstaben in meinem vector<char> txtCounter;

    ich habe eine klasse word erstellt mit dem konstruktor

    word::word(char text, int i)
    {
        txt=text;
        counter=i;
    }
    

    und in meiner encrpytion klasse (der name ist so gewählt weil wir dann noch was verschlüsseln sollen 😉 ) habe ich die methode mit der ich die textdatei einlese

    void Encrypt::einlesen()
    {
        fstream InputFile ("Text.txt", ios::in);
    
    	char c;
    
    	InputFile.get (c);
    	while (!InputFile.eof ())
    	{
                txtCounter.push_back(c);
    	    InputFile.get (c);
    	}
    
        	InputFile.close ();
    }
    

    das funktioniert alles wunderbar alle einzelnen buchstaben landen im txtCounter vector.

    aber jetzt versuche ich die buchstaben zu zählen und sie in meinem vector<word> saveWords vector zu speichern aber das geht nicht
    hier ist meine methode

    void Encrypt::countChars()
    {
        int y=0;
        for(char x='A'; x<='z'; x++)
        {
            int counter=0;
            for(int i=0; i<txtCounter.size(); i++)
            {
               if(txtCounter.at(i)==x)
               {
                   counter++;
               }
            }
            cout<<x<<": "<<counter<<endl;  //test ob alles stimmt
            saveWords.push_back(word(x,counter));
        }
    }
    

    das kommische ist mit cout teste ich das ganze und alle werte stimmen
    aber sobald ich dann versuche ein objekt vom typ word mit dem richtigen buchstaben und der anzahl dieses buchstaben zu speichern kommen ganz seltsame werte raus
    also statt e:220 kommt dann sowas wie e:12432983278 raus
    was viel zu viel ist

    an der ausgabe kanns eigentlich nicht liegen da ich die so ausgebe:

    char word::getChar()
    {
        return txt;
    }
    
    int word::getInt()
    {
        return counter;
    }
    
    void Encrypt::Ausgabe()
    {
        for(it2=saveWords.begin(); it2!=saveWords.end(); it2++)
        {
            cout<<it2->getChar()<<": "<<it2->getInt()<<endl;
        }
    }
    

    weiss jemand woran das liegen kann?
    vielleicht hänge ich einfach schon zu lang am code und sehe den fehler nicht 🙂

    schonmal danke im voraus für die hile 🙂



  • Ich würde ganz anders zählen.

    char ch;//wertebereich -128 bis 127
    while(datei.get(ch))
    {
       unsigned char uch=ch;//wertebereich 0 bis 255, ideal für arrayindex
       ++anzahl[uch];
    }
    

    und so Sachen wie 'a' bis 'z' erst bei der Auswertung beachten.

    Zum Beispiel die Großbuchstabenanzahlen auf die Kleinbuchstabenanzahlen addieren und ab dann nur die Kleinbuchstaben benutzen.

    for(char ch='A';ch<='Z';++ch)
       anzahl[ch-'A'+'a']+=anzahl[ch];
    

    Und rein damit ins sortierbare Array

    for(char ch='a';ch<='z';++ch)
       saveWords.push_back(word(ch,anzahl[ch]));
    

  • Mod

    Abgesehen von den wesentliche Verbesserungen die noch möglich sind und die volkard schon anspricht, können wir ja trotzdem mal deinen Fehler suchen. Ungwöhnlich große Zahlen sind in der Regel uninitialisierte Werte. Da geht irgendwo in deiner word-Klasse etwas schief. Die Stellen die du gezeigt hast, sehen jedoch erst einmal richtig aus. Zeig mal die komplette word-Klasse.



  • danke für den tipp volkard so hab ichs noch nicht versucht

    @seppj
    hier ist meine word klasse

    #include <iostream>
    #include <string>
    using namespace std;
    
    class word {
    public:
        word();
        word(char,int);
        word(const word& orig);
        virtual ~word();
        char getChar();
        int getInt();
        void ausgabe();
    private:
        char txt;
        int counter;
    };
    
    #include "word.h"
    
    word::word() {
        txt=' ';
        counter=0;
    }
    
    word::word(char text, int i)
    {
        txt=text;
        counter=i;
    }
    
    int word::getInt()
    {
        return counter;
    }
    
    void word::ausgabe()
    {
        cout<<txt<<": "<<counter<<endl;
    }
    
    char word::getChar()
    {
        return txt;
    }
    
    word::word(const word& orig) {
    }
    
    word::~word() {
    }
    

  • Mod

    word::word(const word& orig) {
    }
    

    Tadah!
    Rate mal, was passiert, wenn ein word kopiert wird. Das passiert z.B. dann, wenn du es in einen vector packst.

    Auch auf den anderen Gebieten zum technischen Aufbau von Klassen, d.h. Konstruktoren, Destruktoren, wozu man sie braucht, wann man sie nicht braucht und wie sie aussehen sollten, scheinst du nicht sicher zu sein. Da solltest du unbedingt noch etwas Lernen.



  • oohhh daran lags wirklich 😃
    danke sepp
    ich arbeite seit neustem mit netbeans und nicht mehr mit visual studio und netbeans hat das immer automatisch erstellt und bis jetzt hats mich nicht gestört 😃

    mist darauf wäre ich wohl nicht gekommen
    thx 🙂

    also den normalen konstruktor oder destruktor kenne ich aber du hast schon recht ich sollte die sachen wenn ich sie nicht kenne nicht einfach so da stehen lassen 🙂


Anmelden zum Antworten