Datei öffnen/einlesen, Häufigkeit berechnen



  • Erst mal vielen Dank für das Beispiel 🙂

    Aber ich wollte da noch mal was nachfragen. Doch zunächst mal eine kleine Beschreibung von mir was in dem Beispiel passiert, ihr könnt mir dann ja sagen ob ich es richtig verstanden habe.

    Mit dem "input.get(c))" hole ich mir entsprechend die Zeichen aus der Textdatei und "c" müsste dann meines Wissens nach den Wert vom letzten Zeichen haben, in meinem Fall ein "ß". Da, wenn ich es richtig nachgeguckt habe input auf "_FILEBUFFER" und "_MYFILE" zeigt.

    Im Counter werden dann alle Zeichen aufgelistet mit Angabe der Position + Häufigkeit.

    Dann noch zwei Erweiterungen an die ich mich rantasten wollte:

    1. Der Benutzer kann auswählen ob es sich um einen ASCII(mit .de Code Page) oder ANSI Text handelt

    und 2)
    Wenn die Statistik erzeugt wurde was die Häufigkeit angeht, dann soll der User als Ausgabe die Häufigkeit der einzelnen Buchstaben + Prozentzahl (2 Stellen hinter dem Komma) in Bezug auf die Anzahl aller Zeichen ausgegeben.

    Zum ersten Punkt:

    Da kann ich doch zunächst mal mit scanf oder cin z.B. die Eingabe des Users abfangen und die bei der weiteren Verarbeitung doch eigentlich auch als Referenz übergeben oder?



  • Mh habe gerade ein Formatierungsproblem. Hat da jemand eine Idee?

    error C2440: '=' : cannot convert from 'FILE **' to 'wchar_t *'
    

    Hier der entsprechenden Code Teile:

    int main(int argc, char *argv[])
    {
    
    	FILE *datei;
    	char c;
    	wchar_t *str;
    	str = &datei;
    	int numclosedfiles = _fcloseall(); 
    
        cout << "++++++++++++ Willkommen ++++++++++++"; 
        cout << "\n"; 
        cout << "\n"; 
        cout << "Bitte geben Sie den Namen der Datei ein, die Sie jetzt gerne oeffnen wollen\n"; 
        cout << "\n"; 
        //cin >> str; 
        cout << "\n"; 
        //cout << "Sie haben vor folgende Datei zu oeffnen: " << str; 
        cout << "\n"; 
    
        // Datei lesen, falls nicht möglich Versuch gescheitert 
        // Ausgabe wird erzeugt, dass die Datei nicht geöffnet werden konnte 
    	errno_t err; 
    
        err = fopen_s(&datei, "test.txt", "r"); 
        if(err == 0) 
        { 
            cout << "Die Datei wurde erfolgreich geoeffnet!\n";
    		cout << "\n";
    
            map<char, unsigned int> counter;
    		locale locale;
    		ifstream input("test.txt");
    		while(input.get(c))
    		{
    			c = tolower(c, locale);
    			++counter[c];
    
    		}
    		for_each(counter.begin(), counter.end(), &printCounter);
    		input.close();
    


  • Ich hab ne Idee: nimm den wchar_t* raus! Dein FILE* ist ein Handle, kein Dateiname, falls du das denkst.



  • Ist schon raus, war ja auch unsinnig.

    Ok, jetzt bin ich glaube ich wieder einen Schritt weiter. Jetzt übergibt er mir von meiner Eingabe "test.txt" schon mal das "t" ^^.

    Nur habe ich das ja jetzt gerade "fest eingetragen".

    FILE *datei;
    	char c;
    	char str;
    	int numclosedfiles = _fcloseall(); 
    
        cout << "++++++++++++ Willkommen ++++++++++++"; 
        cout << "\n"; 
        cout << "\n"; 
        cout << "Bitte geben Sie den Namen der Datei ein, die Sie jetzt gerne oeffnen wollen\n"; 
        cout << "\n"; 
        cin >> str; 
        cout << "\n"; 
        cout << "Sie haben vor folgende Datei zu oeffnen: " << str; 
        cout << "\n"; 
    
        // Datei lesen, falls nicht möglich Versuch gescheitert 
        // Ausgabe wird erzeugt, dass die Datei nicht geöffnet werden konnte 
    	errno_t err; 
    
    	char *pstr;
    	pstr = &c;
        err = fopen_s(&datei, "test.txt", "r"); 
        if(err == 0) 
        { 
            cout << "Die Datei wurde erfolgreich geoeffnet!\n";
    		cout << "\n";
    
            map<char, unsigned int> counter;
    		locale locale;
    		ifstream input("test.txt");
    		while(input.get(c))
    		{
    			c = tolower(c, locale);
    			++counter[c];
    
    		}
    		for_each(counter.begin(), counter.end(), &printCounter);
    

    Wie kann ich dass denn jetzt dynamisch machen? Also sprich das er die Eingabe des Users (am besten mit Kontrolle auf das Format, von wegen XYZ.txt) an FILE*datei übergibt?



  • Ein char ist nicht dasselbe wie ein char*! Du definierst str als char, das ist ein einzelnes Zeichen (daher kriegst du nur das 't')! Eine Zeichenkette musst du anders definieren, z.B. "char str[50]". So legst du ein Array of chars (also einen String, eine Zeichenkette) mit der Länge 50 an. Denk dran, dass da auch nur 49 Zeichen und die abschließende Null reinpassen!

    Und an FILE übergeben musst du gar nix, zumindest nicht so wie du denkst. Du musst die Funktion fopen verwenden und den Rückgabe-Wert deinem FILE-Pointer zuweisen. Alternativ gibt es auch die bereits erwähnte C++-Variante mit Streams (ifstream, ofstream).



  • Also muss ich was in dem Stil machen?

    char str[50];
    
    und dazu:
    
    str = &str[0];
    str + i = &str[i];
    


  • bmth schrieb:

    Also muss ich was in dem Stil machen?

    char str[50];
    
    und dazu:
    
    str = &str[0];
    str + i = &str[i];
    

    Hui! 😮

    Also wenn das dein Ernst ist: vergiss das Programm, das übersteigt deine momentanen Kenntnisse einfach noch. Du solltest nicht einfach drauf losprogrammieren, sondern dir erstmal die Grundlagen aneignen. Denn was du im geposteten Code machst, ist vollkommen sinnfrei, sorry. Und das wird dir sicher klar, sobald du dich mal mit den grundlegensten Dingen vertraut gemacht hast.



  • Hab das wieder rausgenommen, jetzt läuft es wieder. Er zeigt mir die Liste der Buchstaben/Zeichen etc. und deren Häufigkeit an.

    Ich muss das eben noch hinkriegen das die Eingabe per Pointer/Referenzen weitergegeben werden und das Laden der .txt nicht mehr statisch ist.

    Aber irgendwie komme ich da gerade durcheinander was die Pointer angeht und welcher auf was zeigen muss -.-

    Nur irgendwie muss man es ja mal versuchen praktisch umzusetzen.





  • bmth schrieb:

    Nur irgendwie muss man es ja mal versuchen praktisch umzusetzen.

    Das ist an sich richtig. Aber ohne Grundlagenwissen kommt man da nicht weit. Daher ist es ganz am Anfang sinnvoller, ein Tutorial/Buch durchzuackern und sich an den dort notierten Beispielen zu orientieren, anstatt sich selbst eine Aufgabe auszudenken, die eventuell am für einen Anfänger sinnvollen Lernziel vorbeischießt.


Anmelden zum Antworten