Text-File Scanner

FingerSkill

Erfahrenes Mitglied
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 :D

Hier hab ich den Code soweit ichs geschafft hab das es funktioniert:
Code:
#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, Finga
 
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?
C++:
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;
}
Gruß
 
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 :D

Hab mit deinem Code bissle ein Problem, verstehen tu ich ihnn aber glaub ich soweit:
C++:
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 Finga
 
Zuletzt bearbeitet von einem Moderator:
Ich verwende eof() um das Ende der Datei zu erkennen.
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.
C++:
ifstream infile(filename); //da verstehe ich ned wofür das is
Zum Datei öffnen.
C++:
  set<string> wortliste; //da ekomm ich nen compiler error "`set' undeclared (first use this function)"
Du mußt den entsprechenden Header einbinden:
C++:
#include <set>

Gruß
 
Zuletzt bearbeitet von einem Moderator:
hmmm... Jetzt is der eine Fehler weg^^ kommt schon der nächste.
und zwar genau hier:
C++:
    if (set.count(wort) == 0) { // missing template arguments before '.' token

Also irgendwie steh ich da an :'(
 
Zuletzt bearbeitet von einem Moderator:
Wow, super thx Funktioniert! Jetzt versuch ich das mal soweit weiterzubauen wie ichs haben will.

Melde mich ev. hier nochmal wenn ich darf,
Gruss finga
 
Hi.

Irgendwie fällt mir gerade auf, das es etwas unsinnig ist, was ich da gemacht habe.

Es sollte eigentlich so aussehen:
C++:
set<string> wortliste;
 
while (infile >> wort) {
  wortliste.insert(wort);
}

cout << "Worte: " << wortliste.size() << endl;
Gruß
 
Hehe, ja wollt grad fragen wofür die if Anweisung war aber das hat sich soeben erübrigt :D

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:
C++:
#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;
}
 
Zuletzt bearbeitet von einem Moderator:
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...
Dir ist schon bewußt, dass nur die eindeutigen Wörter gezählt werden?

Gruß
 
Zurück