Zeilen aus .txt lesen und die darin enthaltenen Zahlen addieren



  • In der Textdatei ist alles enthalten also je nachdem was jemand reinschreibt.

    Als Beispiel eine .txt Datei:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt

    Das Programm soll mir jetzt auf den Bildschirm bringen:
    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt
    34 // 27+5+2

    Ich schaffe es zwar den text auszugeben jedoch nicht dieses Ergebnis



  • bLaCk_sLaDe schrieb:

    In der Textdatei ist alles enthalten also je nachdem was jemand reinschreibt.

    Als Beispiel eine .txt Datei:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt

    Das Programm soll mir jetzt auf den Bildschirm bringen:
    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt
    34 // 27+5+2

    Ich schaffe es zwar den text auszugeben jedoch nicht dieses Ergebnis

    ach so ok... 🙂

    dann schau dir das mal an... (ganz unten das beispiel...)
    http://www.cplusplus.com/reference/regex/regex_search/

    dann musts du nur noch addieren und den ausdruck anpassen 😉 ...

    lg



  • ps. falls du noch hilfe dabei brauchst, sag bescheid... 🙂



  • bLaCk_sLaDe schrieb:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt
    34 // 27+5+2

    Dein Algorithmus ist also Dir die Zeichen einzeln anzusehen und wenn eine Zahl kommt solange wie möglich Zahlen einzulesen um dann daraus ein Ergebnis zu basteln. Das klingt einleuchtend.

    Ich würde Dir vorschlagen, dass Du nicht alles in die main() klatscht, sondern dir Helferlein schreibst.

    Kannst Du eine Funktion schreiben

    int liesZahl(const char* s);
    

    die, wenn ich Ihr einen String reinschmeisse, z.B. "123" die Zahl 123 zurückgibt?

    Das wäre schonmal die halbe Miete.



  • Furble Wurble schrieb:

    bLaCk_sLaDe schrieb:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt
    34 // 27+5+2

    Dein Algorithmus ist also Dir die Zeichen einzeln anzusehen und wenn eine Zahl kommt solange wie möglich Zahlen einzulesen um dann daraus ein Ergebnis zu basteln. Das klingt einleuchtend.

    Ich würde Dir vorschlagen, dass Du nicht alles in die main() klatscht, sondern dir Helferlein schreibst.

    Kannst Du eine Funktion schreiben

    int liesZahl(const char* s);
    

    die, wenn ich Ihr einen String reinschmeisse, z.B. "123" die Zahl 123 zurückgibt?

    Das wäre schonmal die halbe Miete.

    er möchte zeilenweise einlesen...
    da müsstest du einlesen und dann alles wieder "zerfummeln..."

    ich würde lieber die regex nutzen die sind für so etwas wie gemacht und können auch zeilenweise genutzt werden... ist einfacher...

    funktionen sollte man nutzen soweit dies sinn macht...
    nutze nicht const char* sonder std::string 😉 ...

    lg



  • Hallo MfG,

    MfG schrieb:

    wie sieht denn deine txt datei aus?
    sind dort nur zahlen?

    .. mal angenommen, da ständen Zahlen,

    MfG schrieb:

    //solange noch zeilen gelesen werden
    	while(std::getline(meineDatei, temp))
    	{
    		std::cout << temp << std::endl; //temp enthält den inhalt einer Zeile... hier könnte dann der regex angewendet werden... 
    		counter++;
    	}
    

    .. dann sollte man da auch Zahlen lesen und bitte nicht mit dem getline-regex-Hammer auf das kleine Problem losgehen.

    Du hast hier im Forum nun schon mehrfach vorgeschlagen, Text-Dateien mit getline zu lesen und anschließend die Zeilen zu interpretieren. Das ist eine der weit verbreitesten "Lösungen", die das Internet zu bieten hat, aber das macht sie nicht besser.

    Lies bitte:
    http://www.c-plusplus.net/forum/p2202150#2202150
    http://www.c-plusplus.net/forum/311915-full
    http://www.c-plusplus.net/forum/281283-full

    und gib dem std::istream eine Chance - er hat eine schlechte Presse, aber der Standard hat hier nichts anders.
    Zugegeben: bei dem von bLaCk_sLaDe beschriebenen Problem ist es schwierig, aber möglich!

    Gruß
    Werner



  • Werner Salomon schrieb:

    Hallo MfG,

    MfG schrieb:

    wie sieht denn deine txt datei aus?
    sind dort nur zahlen?

    .. mal angenommen, da ständen Zahlen,

    MfG schrieb:

    //solange noch zeilen gelesen werden
    	while(std::getline(meineDatei, temp))
    	{
    		std::cout << temp << std::endl; //temp enthält den inhalt einer Zeile... hier könnte dann der regex angewendet werden... 
    		counter++;
    	}
    

    .. dann sollte man da auch Zahlen lesen und bitte nicht mit dem getline-regex-Hammer auf das kleine Problem losgehen.

    Du hast hier im Forum nun schon mehrfach vorgeschlagen, Text-Dateien mit getline zu lesen und anschließend die Zeilen zu interpretieren. Das ist eine der weit verbreitesten "Lösungen", die das Internet zu bieten hat, aber das macht sie nicht besser.

    Lies bitte:
    http://www.c-plusplus.net/forum/p2202150#2202150
    http://www.c-plusplus.net/forum/311915-full
    http://www.c-plusplus.net/forum/281283-full

    und gib dem std::istream eine Chance - er hat eine schlechte Presse, aber der Standard hat hier nichts anders.
    Zugegeben: bei dem von bLaCk_sLaDe beschriebenen Problem ist es schwierig, aber möglich!

    Gruß
    Werner

    🙄
    danke für den tipp/hinweis, du hast nat. vollkommen recht...

    jop ich gehe sehr gerne so vor, ich kenne aber auch alternativen... 🙂
    ich nutze diese auch... 😃

    nur er wollte ja "Zeilen aus .txt lesen und .... " deswegen getline()... 🙄

    ja klar regex ist vll nen großes thema...
    bin gerade nicht auf skipline gekommen...
    das wäre nat. ein schönerer und eleganterer ansatz als regex, zweifelslos... 😃

    temp muss bei meinem beispiel ein string sein... da dieser jeweils die ganze zeile enthält...
    int könnte man dort nur benutzen wenn man skipline nutzt...
    und wirklich gezielt ints raussucht...

    meinst du es macht hier wirklich einen merklichen unterschied ob ich zeilen einlese oder zeichen? (bezogen auf das txt beispiel vom fragesteller...)
    (warum? oder hast dazu vll mal einen interessanten link...)

    also fazit: mach es so wie werner salomon gesagt hat ! 🙂
    meine lösung ist nicht optimal...



  • hab gerade gesehen ich hab mich verschrieben...
    nicht skipline sonder istream 😃 ...
    lg



  • Ich bin noch Anfänger und auch nur Hobbyprogrammierer, aber ich habe mich mal gerade ran getraut.

    Eingabe:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt 
    Immer wenn ich 6 aus 49 spiele geht mir 1er ab!
    Was wäre ich bloß ohne Zahlen.
    C++98, C++03 und C++11 sind im Jahre 2014 bekannt und bald kommt C++14.
    3 mal 3 ist 9.
    

    mein Programm:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    int main() 
    {
    
    	ifstream file("text.txt");
    	string line;
    
    	while (getline(file, line)) {
    		istringstream stream(line);
    
            int n;
            int sum = 0;
            char c;
    
    		while( !stream.eof() ) {
            	stream >> n;
    
     			if ( stream.fail() ) {
     				stream.clear();
     				stream >> c;
     			} else {
     				sum += n;
     			}
    		}
    		cout << sum << endl;		
    	}  
    	return 0;
    }
    

    Ausgabe:

    34
    56
    0
    2140
    15
    

  • Mod

    Man koennte ignore(1) sagen, anstatt einen char zu lesen. So bringt man besser zum Ausdruck, dass man ein Zeichen ueberspringen moechte und gar nicht da dran interessiert ist, was fuer ein Zeichen das genau ist. Und - auch wenn es hier wohl komplett irrelevant ist - das ignore ist ein kleines bisschen schneller, eben weil es keinen char extrahieren und um eine Position weiter springen muss, sondern nur um eine Position weiter springen.



  • Danke für den Tipp, da lernt man doch als Anfänger die Profis zu schätzen. Ich habe das gleich mal ausprobiert und zudem noch die Auflage erfüllt, dass auch die Textzeile mit ausgegeben wird.

    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    int main() 
    {
    
    	ifstream file("text.txt");
    	string line;
    
    	while (getline(file, line)) {
    		istringstream stream(line);
    
            int n;
            int sum = 0;
    
    		while( !stream.eof() ) {
            	stream >> n;
    
     			if ( stream.fail() ) {
     				stream.clear();
     				stream.ignore();
     			} else {
     				sum += n;
     			}
    		}
    		cout << line << endl;
    		cout << sum << endl;		
    	}  
    	return 0;
    }
    

    Ausgabe:

    Ich bin xyz und 27 Jahre alt, und versuche seit 5 stunden die Datei zum laufen zu bringen was mich langsam zum ver2feln bringt 
    34
    Immer wenn ich 6 aus 49 spiele geht mir 1er ab!
    56
    Was wäre ich bloß ohne Zahlen.
    0
    C++98, C++03 und C++11 sind im Jahre 2014 bekannt und bald kommt C++14.
    2140
    3 mal 3 ist 9.
    15
    


  • Der Threadersteller hat sich ja leider nicht mehr gemeldet.

    Ich gehe davon aus, dass man die Aufgabe lösen kann indem man nur zwei oder drei einfache Funktionen auf char(-Arrays) implementiert. ist_zahl() , laenge_zahl() , lies_zahl() o.ä.

    "Einfache Funktionen" ist in diesem Zusammenhang relativ...
    Allerdings ist das schaffbar. Insbesondere, wenn man - wie der OP - schon so einen schönen Algorithmus erdacht hat.
    Divide et impera!



  • Furble Wurble schrieb:

    Der Threadersteller hat sich ja leider nicht mehr gemeldet.

    Ja - viele melden sich dann nie wieder. Ist schade .. manchmal wäre man schon froh, wenn sie nur schreiben, dass sie die Antwort(en) nicht verstehen. Dann könnte man wenigstens drauf reagieren.

    Furble Wurble schrieb:

    Divide et impera!

    👍 ist immer gut
    z.B. so:

    #include <iostream>
    #include <cctype> // std::isdigit
    #include <fstream>
    
    // --   überliest alles, was keine Ziffer ist
    std::istream& skipNoDigit( std::istream& in )
    {
        for( int m; (m = in.peek()) != std::istream::traits_type::eof() && !std::isdigit( m ); )
            in.ignore();
        return in;
    }
    
    int main()
    {
        using namespace std;
        ifstream file("input.txt");
        if( !file.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
        cout << file.rdbuf() << endl; // Inhalt ausgeben
    
        file.clear();
        file.seekg( ios_base::beg );    // rewind
    
        int sum = 0;
        for( int zahl; file >> skipNoDigit >> zahl; )
            sum += zahl;
        cout << "Summe:" << sum << endl;
    }
    

Anmelden zum Antworten