txt datei einlesen und bearbeiten in c++



  • Ok, der Fehler ist weg, dafür meckert er dann bei den anderen "str´s".

    fopen_s(&datei, str, "r"); 
    	if(datei) 
    	{ 
    		cout << "Die Datei wurde erfolgreich geoeffnet!\n";
    		cout << "\n";
    		map<char, unsigned int> counter;
    		locale locale;
    		ifstream input(str);
    
    		while(input.get(str, sizeof(str))) 
    		{
    			c = tolower(str, locale);
    			++counter[str];
    
    		}
    			for_each(counter.begin(), counter.end(), &printCounter);
    

    Einmal hier:

    error C2440: '=' : cannot convert from 'char *' to 'char'
    
    =>c = tolower(str, locale);
    

    Und dann:

    error C2679: binary '[' : no operator found which takes a right-hand operand of type 'char [50]' (or there is no acceptable conversion)
    
    => ++counter[str];
    

    Was den ersten Fall angeht, so kann ich meines Wissens nach nicht innerhalb der Klammer was konvertieren da er sonst annimmt dass ich z.B. 3 Argumente übergeben will. Folglich gibt es dann auch einen Error.

    Beim Counter wird er ja genau wie vorher wohl dasselbe Problem haben 😕



  • 1. Fehler.:
    http://www.cplusplus.com/reference/std/locale/tolower/
    ->
    charT tolower (charT c, const locale& loc);
    du hast aber
    char tolower ( char* c, const locale& loc);
    du darfst eben immer nur ein einziges zeichen übergeben - sollte aber eigtl klar sein ^^

    2. Fehler.:
    meinst du dort nicht eher ++counter[c]; ?!

    ich würd die schleife anders schreiben - so entfallen mehrere probleme:

    char tmp;
        while( input.get(tmp) )
        {
            char c = tolower(tmp, locale);
            ++counter[c];
        }
    

    zu get:
    http://www.cplusplus.com/reference/iostream/istream/get/

    bb



  • bmth schrieb:

    Ok, der Fehler ist weg, dafür meckert er dann bei den anderen "str´s".

    {
    			c = tolower(str, locale);
    			++counter[str];
    
    			
    		}
    

    Einmal hier:

    error C2440: '=' : cannot convert from 'char *' to 'char'

    =>c = tolower(str, locale);
    

    Das geht so nicht. Bitte sieh mal nach, wie man tolower benutzt, und was der Unterschied zwischen einem Zeiger auf ein char (in Deinem Fall str) und einem char ist.



  • Stimmt der eine Fehler war das str im Counter, wo c hin musste. Was den Rest angeht, so hatte man mir diese Lösung vorgeschlagen, jedoch war die ja scheinbar nicht 100% korrekt.

    Aber es klappt jetzt mit dem öffnen + auslesen der Datei inklusive zählen der Buchstaben 🙂

    Als nächstes werde ich mich dann mal versuchen die entsprechenden Prozente zu berechnen (Alle Zeichen insgesamt und in Bezug darauf die % Werte (mit 2 Nachkommastellen) für die einzelnen Buchstaben.

    Vielleicht melde ich mich gleich dann noch mal, falls ich wo hängen bleibe. Aber danke noch mal für die fixe Hilfe 🙂



  • Mh ok...also teilweise komme ich noch nicht an die richtigen Werte dran.

    Was ja sicher ist -> in tmp steht dann die Anzahl der Zeichen drin (insgesamt).

    Nur wie mache ich es jetzt am besten dass ich für jeden der Buchstaben meine % rauskriege.



  • erstmal alles zusammenrechnen und dann einfach teilen? Oo

    bb



  • Was ja sicher ist -> in tmp steht dann die Anzahl der Zeichen drin (insgesamt).

    Öhm nö.

    Nur wie mache ich es jetzt am besten dass ich für jeden der Buchstaben meine % rauskriege.

    Öhm Dreisatz ?



  • Ja dass ich dafür nen Dreisatz brauche ist mir bewusst. Aber irgendwas passt noch nicht.

    Ich hab jetzt z.B. in meiner .txt Datei folgendes stehen:

    "ABCDABCABA"

    Sprich 4xA; 3xB etc.

    So, raus bekomme ich gerade:

    A0
    B0
    C0
    D0
    A1
    B1
    C1
    A1
    B1
    A2

    ^^



  • oO

    Zeig mal noch ma Code, pls ^^

    bb



  • fopen_s(&datei, str, "r");
    	if(datei) 
    	{ 
    		cout << "Die Datei wurde erfolgreich geoeffnet!\n";
    		cout << "\n";
    		map<char, unsigned int> counter;
    		locale locale;
    		ifstream input(str);
    
    		while( input.get(tmp) ) 
    		{ 
    			char c = tolower(tmp, locale); 
    			++counter[c];
    			cout << "\n" << tmp;
    
    		}
    			for_each(counter.begin(), counter.end(), &printCounter);
    

    Bitte sehr ^^

    Also wie gesagt, es wird eine Eingabe des Users getätigt. Ist die Eingabe korrekt und die Datei existiert, dann wird zunächst eine Statistik ausgegeben. In dieser wird angezeigt wie oft welcher Buchstabe/Zeichen/Zahl vor kommt.

    Resultierend aus der Häufigkeit des einzelnen Zeichens in Bezug auf die Gesamtzahl aller Zeichen soll dann eine Prozentangabe berechnet und ausgegeben werden (Beispiel: 4, 50(%)).

    Und das klappt gerade bei mir halt noch nicht.

    *Ich hab meine Dreisatz Klamotten mal entfernt, weil das war wohl Murks, darum die Ausgabe wie in meinem vorherigen Post*



  • locale locale; compiliert? Oo

    open_s(&datei, str, "r");
    das wurde aber schon gesagt, dass man die FILE* fkt nich mit streams mischen sollte, oder?!

    std::map<char, unsigned int> counter;
    std::ifstream input("dateiname.txt");
    while( input.get(tmp) ) 
    { 
       char c = tolower(tmp, std::locale()); 
       ++counter[c];
    }
    std::for_each(counter.begin(), counter.end(), &printCounter);
    

    bb



  • Ja das lässt sich wirklich kompilieren, ohne Warnings oder sonst was. Wie gesagt mein Prob ist gerade, dass es mit der Berechnung der einzelnen Prozente nicht hinhaut. Alles andere geht ja soweit.



  • na dann such mal std::accumulate oder rechne das zeugs per hand zusammen und dann nimm eben immer aktuelle_buchstabe_anz/float(gesamt_anzahl)
    und schon geht alles genau so, wie du dir das vorgestellt hast...
    musst nur darauf achten, dass du es so nicht als integer abspeicherst ^^
    sondern entweder erst noch *100 rechnest oder gleich als float speicherst / ausgibst

    bb



  • Mh irgendwie weiss ich nicht genau wo/wie ich da jetzt ansetzen soll. Hab mir z.B. die Accumulate Sachen mal angeschaut, aber bin mir nicht sicher wo ich das genau reinpacken muss.



  • Hab gerade beim debuggen gesehen, dass der Counter im Prinzip 4 Arrays anlegt. In denen steht dann entsprechend die Häufigkeit der Buchstaben.

    Das Ganze sieht laut Debugger so aus:

    [0](97 'a' 1)
    [1](98 'b' 1)
    [2](99 'c' 1)
    [3](100 'd' 1)
    

    So...wenn er dann ein mal mal durchgelaufen ist sieht es dann im Prinzip gleich aus, lediglich die letzte zahlenreihenfolge schaut dann so aus:

    4
    3
    2
    1

    Das stimmt auch alles. Nur wie komme ich da jetzt dran an diese Inhalte um meine prozentrechnung durchführen zu können. Und zudem möglichst einfach ohne großartige Umwandlungen oder Vectoren. Gibt es da eine Möglichkeit?



  • so ungeschickt kann man sich doch gar nich mehr anstellen -.-

    A 4
    B 3
    C 2
    D 1

    4+3+2+1 = 10
    P(A) = 4/10 = 40%
    P(B) = 3/10 = 30%
    P(C) = 2/10 = 20%
    P(D) = ...

    bb



  • Wenn der Inhalt der .txt fest wäre könnte man das so machen, ansonsten darf man auch wieder frickeln ^^



  • map<char, unsigned int>::iterator it=counter.begin();
          while(it!=counter.end())
          {
             cout << it->first << ":" << it->second << " - " << (it->second*100)/cgesamt << endl;
             it++;
          }
    


  • du hast doch nu ne map, wo alles drin steht, was du brauchst... -.-

    maps kann man auch (mit iteratoren) durchgehen und so die summe aus allen zeichen bilden - alternativ könnte man auch gleich mitzählen, aber darin seh ich keinen vorteil...
    und schon bist du fertig...

    bb



  • So, ich habs jetzt noch mal anders aufgezogen. Was klappt ist die Ausgabe der Buchstaben mit den Prozentwerten. Jedoch werden die Zahlen und Zeichen noch nicht richtig mit einberechnet. Hat jemand eine Idee wie ich das am besten mit integrieren kann? Hier mal mein Quellcode:

    int main(int argc, char *argv[])
    {
    	FILE *datei;
    	char str[50];
    	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 
    
    	fopen_s(&datei, str, "r");
    	if(datei) 
    	{ 
    		cout << "Die Datei wurde erfolgreich geoeffnet!\n";
    		cout << "\n";		
    		map<char, unsigned int> counter;
    		locale locale;
    		char h;		
    		char textlength; // Einlesen der gesamten Textlänge
    		char characters; // entsprechend einlesen der einzelnen Buchstaben
    		char c; // für das einlesen eines einzelnen Zeichensint 
    		char strDigi;
    		double percent = 0.0; // Notwendig für die Berechnung und Darstellung der % Werte		
    
    		for (h = 0; h < 27; ++h) {
    			counter[h] = 0;
    		}
    		// Setzt das Feld auf Null, Vorbeugung		
    		textlength = 0;
    
    		// Nun in einer while Schleife die einzelnen Zeichen für Zeichen durchgehen
    		// inklusive hochzähle
    
    	/*
    		ifstream input(str);
    		char tmp;
    		while( input.get(tmp) ) 
    		{ 
    			char c = tolower(tmp, locale); 
    			++counter[c];
    		}
    			for_each(counter.begin(), counter.end(), &printCounter);
    	*/	
    		ifstream input(str);
    		while( input.get(c) ) 
    		{ 
    			++textlength;
    			if (toupper(c)){
    				++counter[c-'A'];
    			}
    			else if(tolower(c)){
    				++counter[c-'a'];
    			}
    			/*
    			else if (isdigit(c){
    				int isAdigi;
    				isAdigi = atoi (strDigi);
    				++counter[c-strDigi];
    			}
    			*/
    		}
    		for_each(counter.begin(), counter.end(), &printCounter);
    
    		characters = textlength - counter[c];
    
    		printf("Laenge des Textes: %i \n", textlength);
    		printf("Anzahl der Buchstaben: %i \n", characters);
    		printf("Sonstige Zeichen: %i", counter);
    
    		cout << "\n";
    
    		for(h =0; h < 26; h++) {
    			percent = (double) counter[h] / (double)characters * 100.0;
    			printf("%4c %9i %9.2f %%\n", ('A' + h), counter[h], percent);
    		}
    

Anmelden zum Antworten