txt datei einlesen und bearbeiten in c++



  • Frickl0r schrieb:

    Ja, und genau das wird mit dem Code in der Konsole auch ausgegeben!
    Und was nun? Lass dir doch nicht alles aus der Nase rausziehen!

    Ich denke, dass er die Daten verteilt auf einen Vektor haben möchtet. Allerdings sitzen wir noch morgen hier, wenn uns nicht klar sagt, was er nun haben und tun möchte.



  • hallo,

    ich möchte Euch für die Hilfe danken.

    ich habe eine Funktion f(Koords *p, int anzP) - in dem ich versuche mahtematisches Problem zu lösen, eine Klasse Koords und eine Text datei mit Koordinaten Liste.

    Ich versuche die text Datei einzulesen und die Koordinaten und Anzahl der Punkte(anzahl der Zeilen) meine Funktion f zu übergeben.

    Bei mir kommt jetzt ehler : "getline": Bezeichner wurde nicht gefunden.



  • Du hast noch eine Funktion? Zeig mal her!

    babadu schrieb:

    Bei mir kommt jetzt ehler : "getline": Bezeichner wurde nicht gefunden.

    Müsstest die string-lib schon inkludieren.



  • std::ifstream coordFile("test.txt");
    
    if(coordFile)
    {
    	std::string temp;
    
    	while(std::getline(coordFile, temp))
    	{
    		std::istringstream iss(temp);
    
    		int x, y;
    
    		iss >> x;
    		iss >> y;
    
    		std::cout << "X: " << x << " / Y: " << y << std::endl;
    	}
    }
    else
        std::cout << "Datei nicht geoeffnet!" << std::endl;
    
    coordFile.clear(); // Falls Wiederverwendung von "coordFile"
    coordFile.close();
    

    Statt "int x, y;" legst du halt ein Koord-Objekt an, beschreibst es mit dem >> Operator von std::istringstream und schiebst es in eine Liste oder whatever.



  • hier eine Ausschnit aus meiner Datei:

    double f(Koords *p, int n)
        {
         //Summe alle Euklidische Abstände
         for (int k = 0; k < n; k ++ )
         {
              double abst += Koords::dist(p[k], p[k-1]);
         }
         return 0;
         }
    


  • Ja, und? Mein Code sollte dir geholfen haben.



  • vielen Dank für Eure Hilfe, habt mir sehr geholfen. Kommen ein Paar Fehlermeldungen, aber ich werde versuchen Damit selbst klar zu kommen.



  • babadu schrieb:

    aber ich werde versuchen Damit selbst klar zu kommen.

    Das ist der richtige Ansatz! 👍
    Falls du dabei auf weitere Probleme stoßen solltest die du alleine nicht gelöst bekommst bist du natürlich herzlich eingeladen weiter zu fragen 🙂



  • die Zeile

    double abst += Koords::dist(p[k], p[k-1]);
    

    liefert mit sicherheit nicht das gewüncschte, denn du legst jedes mal in der for schleife eine variable 'abst' an und addierst auf diese neu erstellte variable eine distanz.
    Was du jedoch machen möchtest ist, alle distanzen zu addieren. Dazu brauchst du VOR der for-schleife
    double abst = 0;
    und IN der for-schleife
    abst += Korrds::dist(p[k], p[k-1]);

    Falls du dich wundern solltest wieso bei dir der abstand immer falsch ist.



  • So, ich poste mal ganz dreist mein Problem hier rein, da es vom Titel her gut passt.

    Kurze Info was gemacht werden soll:

    User gibt einen Dateinamen ein, Datei soll geladen/geöffnet werden, Buchstaben auf Häufigkeit gezählt und entsprechend ausgegeben werden.

    int main(int argc, char *argv[])
    {
    	FILE *datei;
    	char c;
    	char str[50];
    	errno_t err;
    	//err = &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 
    
    	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("");
    
    		while(input.get(str))
    		{
    			c = tolower(str, locale);
    			++counter[str];
    
    		}
    			for_each(counter.begin(), counter.end(), &printCounter);
    

    Derzeit bekomme ich noch die Fehlermeldung:

    error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::get(_Elem &)' : cannot convert parameter 1 from 'char [50]' to 'char &'

    Hatte auch schon versucht Lösungen aus dem Forum etc. einzubringen aber bisher leider ohne Erfolg 😕

    Jemand eine Idee?



  • Wenn du uns jetzt auch noch sagst in welcher Zeilöe die Fehlermeldung auftaucht, müssen wir nicht raten 🙂

    im Übrigen würde ich dir davon abraten, C-FILEs mit C++-fstreams zu vermischen. Entweder oder...



  • Mit Zeile 5 provozierst du einen Bufferoverflow...



  • Kóyaánasqatsi schrieb:

    Mit Zeile 5 provozierst du einen Bufferoverflow...

    Nur wenn es mehr als 50 chars geben wird..

    A. ) Benutz kein FILE/fopen/fclose gefrickel

    B. ) Wieso ein char array? std::string ist doch viel besser, und sicherer.

    C. ) Das kann man viel hübscher machen...



  • Oh, sry das hatte ich nicht mit kopiert. Er meckert Zeile 63 an (while(input.get(str)))

    Mh also mir hatten man gesagt ich sollte am besten FILE + fopen und Co. benutzen und entsprechend die notwendigen Return Werte übergeben. Ich bin jetzt verwirrt was hier die bessere Option ist 😃 Die einen sagen machs so, die anderen wieder ne mach das lieber so und so.

    Hättest du denn ein Beispiel wie ich es, deiner Meinung nach anders/besser machen kann ohne da all zu viel umschreiben zu müssen?



  • Kóyaánasqatsi schrieb:

    Mit Zeile 5 provozierst du einen Bufferoverflow...

    Mit einer Arraydefinition kann man einen Overflow provozieren?



  • bmth schrieb:

    Oh, sry das hatte ich nicht mit kopiert. Er meckert Zeile 63 an (while(input.get(str)))

    while(input.get(str, sizeof(str)))



  • 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 🙂


Anmelden zum Antworten