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, ... etcaber 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 methodevoid 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 istan 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 nichtschonmal 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]));
-
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() { }
-
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örtmist darauf wäre ich wohl nicht gekommen
thxalso 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