tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
407
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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, Finga
     
    Each-one-Teach-one******

    Beste Freunde kann man nicht kaufen: LINUX******

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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?
    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;
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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 Finga
     
    Each-one-Teach-one******

    Beste Freunde kann man nicht kaufen: LINUX******

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von FingerSkill Beitrag anzeigen
    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.
    Zitat Zitat von FingerSkill Beitrag anzeigen
    Code cpp:
    1
    
    ifstream infile(filename); //da verstehe ich ned wofür das is
    Zum Datei öffnen.
    Zitat Zitat von FingerSkill Beitrag anzeigen
    Code cpp:
    1
    
      set<string> wortliste; //da ekomm ich nen compiler error "`set' undeclared (first use this function)"
    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.

  5. #5
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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******

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von FingerSkill Beitrag anzeigen
    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
    Sorry, es muß natürlich heißen:
    Code cpp:
    1
    
    if (wortliste.count(wort) == 0) {
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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
     
    Each-one-Teach-one******

    Beste Freunde kann man nicht kaufen: LINUX******

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    set<string> wortliste;
     
    while (infile >> wort) {
      wortliste.insert(wort);
    }
     
    cout << "Worte: " << wortliste.size() << endl;
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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******

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von FingerSkill Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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, finga
     
    Each-one-Teach-one******

    Beste Freunde kann man nicht kaufen: LINUX******

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von FingerSkill Beitrag anzeigen
    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?
    Naja, so ein std::set verhält sich eben wie eine Menge [math.].
    Zitat Zitat von FingerSkill Beitrag anzeigen
    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?
    Es ist ziemlich ungünstig (laufzeit- und resourcenmäßig).

    Du könntest ja auch die eingelesenen Worte einfach nochmal bearbeiten:
    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);
      }
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    Avatar von FingerSkill
    FingerSkill FingerSkill ist offline Mitglied Brokat
    Registriert seit
    May 2004
    Ort
    Salzburg
    Beiträge
    311
    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 finga
     
    Each-one-Teach-one******

    Beste Freunde kann man nicht kaufen: LINUX******

Ähnliche Themen

  1. SWT: Text aus File in scrollbaren Text ausgeben
    Von Demo6_66/ im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 04.05.10, 15:35
  2. Problem mit Scanner unter „Assistent für Scanner und Kameras“
    Von Jan-Frederik Stieler im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 21.04.09, 21:28
  3. Text über flash file
    Von umbroboy im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 09.11.06, 21:27
  4. Text-File od. XML
    Von ParadiseCity im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 09.05.05, 12:19
  5. file und text problem
    Von seelenflug im Forum PHP
    Antworten: 2
    Letzter Beitrag: 26.07.04, 14:30