ERLEDIGT
JA
JA
ANTWORTEN
12
12
ZUGRIFFE
407
407
EMPFEHLEN
-
06.07.09 14:32 #1
Hi,
ich bin gerade dabei mich bissle in cpp einzuarbeiten und hab da gleich mal eine Frage. Und zwar moechte ich das untenstehende Programm soweit erweitern das ich eine Ausgabe bekomme, welche Wörter wie oft vorhanden sind. Ne Statistik quase
Hier hab ich den Code soweit ichs geschafft hab das es funktioniert:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { char filename[128]; ifstream file; char zeile[1024]; int counter=0; // Dateinamen einlesen cout << "Dateinamen eingeben: " << flush; cin.getline(filename, 127); // Datei öffnen file.open(filename, ios::in); if (file.good()) { // Wenn die Datei geoeffnet werden konnte... // An den Anfang der Datei springen file.seekg(0L, ios::beg); while (! file.eof()) { // Die Datei zeilenweise auslesen file.getline(zeile, 1024); cout << "Zeile " << ++counter << ": " << zeile << endl; } } else { // Wenn die Datei nicht geoeffnet werden konnte, // aus welchen Gruenden auch immer... cout << "Datei nicht gefunden." << endl; } system("PAUSE"); return EXIT_SUCCESS; }
Ich wuerds so machen(PseudoCode), aber weis ned wie das in cpp ausschaut:
arrayAll = alle Wörter
arrayUnique = Woerter die noch nicht hier gespeichert sind einlesen (aus arrayAll)
und nun alle Woerter von arrayUnique zählen.
Weis leider nicht wie ich die einzelnen Woerter aus dem Text in ein Array bekomme.
Vielen Dank im Vorraus, FingaEach-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
06.07.09 17:39 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ein paar auffällige Sachen:- du springst an den Anfang der Datei. Was meinst du denn wo der Dateizeiger steht wenn du die Datei gerade geöffnet hast (und keine ios::ate Option angibst)?
- du verwendest die eof() Methode und weißt nicht warum. Das funktioniert nicht.
- warum liest du zeilenweise ein, wenn du doch eigentlich wortweise einlesen willst?
GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ifstream infile(filename); if (infile.is_open()) { string wort; set<string> wortliste; size_t count = 0; while (infile >> wort) { if (set.count(wort) == 0) { // ist noch nicht vorhanden ++count; } } cout << "Wörter: " << count << endl; }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
07.07.09 09:34 #3
Hoi,
also ich springe an den Anfang der Datei weil ich mir gedacht hab is vielleicht "sauberer". Ich verwende eof() um das Ende der Datei zu erkennen. Vielleicht wärs anderes eleganter gewesen, aber es funktioniert halt. Einlesen tu ich das ganze zeilenweise weil ich ned weis wie ichs wortweise mach
Hab mit deinem Code bissle ein Problem, verstehen tu ich ihnn aber glaub ich soweit:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ifstream infile(filename); //da verstehe ich ned wofür das is if (infile.is_open()) { string wort; set<string> wortliste; //da ekomm ich nen compiler error "`set' undeclared (first use this function)" size_t count = 0; while (infile >> wort) { if (set.count(wort) == 0) { // ist noch nicht vorhanden ++count; } } cout << "Wörter: " << count << endl; }
Und vielen Dank für deine Hilfe,
Gruss FingaEach-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
07.07.09 09:45 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das funktioniert aber nicht. Mit eof kannst du das Ende der Datei nicht erkennen, du überprüfst damit nur ob das eof Bit gesetzt ist. Die Verwendung ist einfach falsch, das hat nichts mit Eleganz zu tun.
Zum Datei öffnen.
Du mußt den entsprechenden Header einbinden:
Code cpp:1
#include <set>
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
07.07.09 09:56 #5
hmmm... Jetzt is der eine Fehler weg
kommt schon der nächste.
und zwar genau hier:
Code cpp:1
if (set.count(wort) == 0) { // missing template arguments before '.' token
Also irgendwie steh ich da an :'(Each-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
07.07.09 10:05 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
07.07.09 10:13 #7
Wow, super thx Funktioniert! Jetzt versuch ich das mal soweit weiterzubauen wie ichs haben will.
Melde mich ev. hier nochmal wenn ich darf,
Gruss fingaEach-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
07.07.09 10:16 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Irgendwie fällt mir gerade auf, das es etwas unsinnig ist, was ich da gemacht habe.
Es sollte eigentlich so aussehen:
GrußCode cpp:1 2 3 4 5 6 7
set<string> wortliste; while (infile >> wort) { wortliste.insert(wort); } cout << "Worte: " << wortliste.size() << endl;
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.07.09 12:14 #9
Hehe, ja wollt grad fragen wofür die if Anweisung war aber das hat sich soeben erübrigt

Thx finga
Ergänzung:
Ich hab das ganze jetzt aktualisiert und wollt gleich noch was dazubasteln da is mir aufgefallen das mir nicht alle Wörter ausgerechnet werden in einer txt wo 10.001 Wörter sein sollten rechnet das Programm nur 441 Wörter raus :'( komm irgendwie ned dahinter...
Hier nochmal der Code:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#include <cstdlib> #include <iostream> #include <fstream> #include <set> #include <string> using namespace std; //Strings zu kleinen zeichen umwandeln string str_lower(string str){ string nstr; unsigned int laenge = str.size(); for(unsigned int i = 0; i < laenge; ++i){ nstr += tolower(str[i]); } return nstr; } int main(int argc, char *argv[]) { char filename[128]; ifstream file; int counter=0; // Dateinamen einlesen cout << "Dateinamen eingeben: " << flush; cin.getline(filename, 127); // Datei öffnen ifstream infile(filename); if (infile.is_open()) { string wort; set<string> wortliste; size_t count = 0; while (infile >> wort) { wortliste.insert(wort); } cout << "Worte: " << wortliste.size() << endl; } system("PAUSE"); return EXIT_SUCCESS; }
Geändert von FingerSkill (08.07.09 um 12:20 Uhr)
Each-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
08.07.09 13:53 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.07.09 14:16 #11
Ahhh, super dann bin ich schon einen Schritt weiter als ich wollte

Und ich check ned ganz wie das Prog die Wörter ausfiltert, oder funktioniert die insert -Methode so das sie Wörter nur anhängt wenn sie noch ned vorkommen?.
hab da noch eine Frage, wie bekomme ich die Beistriche und Punkte aus den Text raus? isses da ned gescheiter das ganze File einzulesen --> Zeichen entfernen --> und erst dann mit dem Zählen anfangen? Sry das hab ich übersehen :'(
Danke und lg, fingaEach-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
-
08.07.09 16:45 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Naja, so ein std::set verhält sich eben wie eine Menge [math.].
Es ist ziemlich ungünstig (laufzeit- und resourcenmäßig).
Du könntest ja auch die eingelesenen Worte einfach nochmal bearbeiten:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10
const char* noise = (".,;:"); while (infile >> wort) { std::replace_if(wort.begin(), wort.end(), std::bind1st(std::ptr_fun(::strchr), noise), ' ') std::istringstream in(wort); std::string split; while (in >> split) { wortliste.insert(split); } }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
13.07.09 12:55 #13
Super danke

Muss jetzt noch schaun wie ich das hinbekomm das ich die Wörter zähle aber ich denke das werd ich hinbekommen, sobald ich das mit den sets verstanden hab
lg fingaEach-one-Teach-one******
Beste Freunde kann man nicht kaufen: LINUX******
Ähnliche Themen
-
SWT: Text aus File in scrollbaren Text ausgeben
Von Demo6_66/ im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 04.05.10, 15:35 -
Problem mit Scanner unter „Assistent für Scanner und Kameras“
Von Jan-Frederik Stieler im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 21.04.09, 21:28 -
Text über flash file
Von umbroboy im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 09.11.06, 21:27 -
Text-File od. XML
Von ParadiseCity im Forum .NET ArchivAntworten: 3Letzter Beitrag: 09.05.05, 12:19 -
file und text problem
Von seelenflug im Forum PHPAntworten: 2Letzter Beitrag: 26.07.04, 14:30





Zitieren

Login






