txt-Datei in Array oder doch nicht ?



  • Hallo,

    folgendes Problem beschäftigt mich gerade.
    Wir haben hier eine txt.datei und sollen mit Hilfe des Headers "algorithm"
    die Anzahl der Wörter in dieser Datei bestimmen.

    Dazu ist wahrscheinlich die Funktion count() zu verwenden.
    Mein Problem ist jetzt, wie ich den Inhalt der Datei in einer Variablen/Array speichern kann, damit ich dann mit count() drauf zugreifen kann.

    Also, ich will praktisch den Inhalt der Datei direkt mit count abzählen.

    Also sowas würde z.B. gehen :

    #include <string>
    #include <iostream>
    #include <algorithm>

    using namespace std;

    int main()
    {
    string test = "Das ist ein Test";
    cout << "Anzahl der Woerter in \"" << test << "\": " << count(test.begin(),test.end(),' ')+1 << endl;
    }

    Ich hoffe, ihr versteht mein Problem.

    Danke schonmal .



  • Einfaches Beispiel zum Auslesen von Textdateien. (Ungetestet)

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
            if(argc != 2)
            {
                   cout << "\n Usage: program.exe inputfile.txt\n";
                   return -1;
            }
            ifstream in(argv[1]);
            if(in.is_open())
            {
                   string data(""), tmp;
                   while(getline(in, tmp))
                           data += tmp + '\n'; 
    
                   // Inhalt der Txt-Datei steht jetzt in der Variablen data.
            }
            else
            {
                   cout << "\n Couldn't open the file \'" << argv[1] << "\'\n";
                   return -1;
            }
            return 0;
    }
    

    Caipi



  • hallo Caipi.

    Vielen Dank, dass hat mich schonmal ein Stück nach vorne gebracht.
    Es funktioniert auch mit dem Zählen, allerdings nur, solange jedes Wort auch nur durch ein Leerzeichen getrennt ist. Zeilensprünge erkennt er leider auch nicht.
    Allerdings muss mein Programm das können, da die Datei halt so aufgebaut ist.

    Hast du veilleicht noch eine Idee, wie ich das ändern könnte ?

    Und vielleicht noch, wie ich verschiede Worte zählen kann ?

    Grüße Chiro



  • chiro schrieb:

    Hast du veilleicht noch eine Idee, wie ich das ändern könnte ?

    Ändere die Zeile

    data += tmp + '\n';
    

    in

    data += tmp + ' ';
    

    Oder meinst du etwas anderes?

    /edit: Wobei das natürlich eine sehr ungenaue Variante sein kann...

    Und vielleicht noch, wie ich verschiede Worte zählen kann ?

    Da fällt mir spontan jetzt nur ein, jedes neue Wort lesen, vergleichen ob es bereits in dem vektor, welcher die Wörter vergleicht, bereits existiert. Wenn ja einen Zähler inkrementieren ansonsten Wort neu in die Liste aufnehmen... (Ich hoffe das war verständlich).
    Diese Lösung ist aber ziemlich inperformant und somit unschön...

    Caipi



  • Hallo Caipi,

    also, mein Programm sieht,mit deiner Hilfe, zum teil so aus .

    ifstream in("datat1.txt");
    if(in.is_open())
    {
    string data(""), tmp;
    while(getline(in, tmp))
    data += tmp + '\n';

    cout<<data<<endl;

    cout << count(data.begin(),data.end(),' ' )+1;

    Ich habe mir halt gedacht, dass man die Wörter zählt, indem man die vorkommenden Leerzeichen zwischen den Wörtern zählt.

    Sieht die txt.datei so aus :
    --------------------
    eins zwei drei vier
    --------------------

    gibt das Programm auch 4 aus.

    Sieht die Datei allerdings so aus :
    -------------------
    eins zwei drei

    vier
    ------------------

    wird 3 ausgegeben, da der Zeilenwechsel nicht beachtet wird.

    Noch eine Möglichkeit:
    ----------------------
    eins zwei drei

    vier fünf
    ----------------------

    wir 26 ausgegeben, da sich halt insgesamt 26 Leerzeichen in der Datei befinden.
    Jetzt suche ich halt nach einer Möglichkeit, dieses Problem zu umgehen.

    Chiro



  • Muss das denn tatsächlich so genau sein? Ohne etwas Aufwand wirst du das nämlich nicht so einfach hinbekommen.

    Mein Vorschlag wäre noch, wenn es denn so exakt sein soll, folgender:

    Am Dateianfang starten:
    
    AKTION:
    Etwaige Blanks am Anfang überlesen.
    Lesen bis zum ersten nicht-Blank.
    Alle nicht-Blanks lesen.
    Wenn der nächste Blank auftaucht Zähler für Wörter inkrementieren.
    
    AKTION wiederholen bis zum Dateiende.
    

    Zähler + 1 = Anzahl der Wörter.

    Caipi



  • Ja, es muss leider genau so sein, da unsere Datei eben so aussieht 😞

    Danke für deine Idee, werde mal schauen, ob ich das so hinbekomme.


Log in to reply