Verbesserung gesucht bei File einlesen



  • Hallo

    Ich wollt mal fragen obs ne bessere Art gibt, ein bestimmtes Wort in einem File zu finden als das:

    std::istream& find_date_time( std::istream& in )
    {
        std::string word = "";
        while( in.good() )
        {
            in >> word;
            if( 0 == word.compare( "Gesendet" ) )
            {
                return in;
            }
        }
        in.ignore( 99999 );
        return in;
    }
    
    int main()
    {
    	ifstream report( "bericht" );
    	if( report.is_open() && lines.is_open() )
    	{
    	    std::string date, time;
            report >> find_date_time >> date >> time
    	}
    	report.close();
    	return 0;
    }
    

    Das File sieht so aus:

    Betreff 	 xxx greift yyy an
    Gesendet	02.07.07 17:12
    Der Angreifer hat gewonnen
    Glück (aus Sicht des Angreifers)
    Pech 	
    
    	Glück 	19.3%
    Moral: 50%
    

    Optimierungsvorschläge wären supi 🙂
    MfG
    ein Anfänger



  • ein "die-staemme" bot? böse böse, du weisst doch, dass die verboten sind 😉



  • otze schrieb:

    ein "die-staemme" bot? böse böse, du weisst doch, dass die verboten sind 😉

    Was? 😮
    Es ist verboten Berichte automatisch zu reformatieren 😃



  • Nein das ist doch kein Bot ^^

    Nur ein BErichte Tool, damit ich den Überblick behalte wo ich wieviel abgefarmt habe und wann zuletzt. Mir schwirrt sonst der Kopf xD



  • OT: wie heisst ihr da und welche welt/server?



  • das gabs mal vor ner ganzen weile im Forum. steht meines wissens nach sogar in den regeln: die stämme darf nur im Browser gespielt werden.

    @darth naja, man kann nie wissen, mit dem auslesen fängts immer an, deshalb direkt intervenieren 😉

    ps: spiel nimmer, war aber otze, damals auf server 1. Hoch leben die Kata kriege!



  • Sagen wir mal ihr wisst gar nicht worum es geht, dann ist da nichts illegales bei 😃
    Bin neu eingestiegen auf w13 und 14..aber s1 ist ja anders 😮

    Hab mal weiter gebastelt:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    typedef std::istream::traits_type traits_type;
    
    std::istream& find_date_time( std::istream& in )
    {
        std::string word = "";
        while( in.good() )
        {
            in >> word;
            if( 0 == word.compare( "Gesendet" ) )
            {
                return in;
            }
        }
        if( traits_type::eq_int_type( in.peek(), traits_type::eof() ) )
        {
            std::cout << "eof";
        }
        in.ignore( 99999 );
        return in;
    }
    
    struct GetDateTime
    {
        std::string& m_date;
        std::string& m_time;
        GetDateTime( std::string& date, std::string& time )
        :   m_date( date ), m_time( time ) {}
    };
    
    template<typename C, typename T>
        inline std::basic_istream<C, T>&
        operator>>( std::basic_istream<C, T>& in, GetDateTime date_time )
    {
        in >> find_date_time >> date_time.m_date >> date_time.m_time;
        return in;
    }
    
    inline GetDateTime get_date_time( std::string& date, std::string& time )
    {
        GetDateTime ret( date, time );
        return ret;
    }
    
    using namespace std;
    
    int main()
    {
    	ifstream report( "bericht" );
    	if( report.is_open() )
    	{
    	    std::string date, time;
            report >> get_date_time( date, time );
            std::cout << "this here " << date << " d " << time << " t \n";
    	}
    	report.close();
    	return 0;
    }
    

    habs in der <iomani> abgeschaut^^
    kann ich das trotzdem anders lösen?

    und eine andere Frage, wie krieg ich die strings 07.07.07 und 23:42 in Zahlen raus?



  • Ohne jetzt auf den Sinn des Ganzen einzugehen:

    • anstelle von compare() würde ich die normalen Vergleichsoperatoren für Strings verwenden (also if(word=="Gesendet")...
    • die Überprüfung auf EOF kannst du dir dort ersparen
    • der zweite Parameter für ignore() hat Defaultwert EOF - wenn du den Rest der Zeile lesen willst, mußt du dort explizit ein '\n' angeben
    • da du vermutlich auch den Rest der Datei noch auswerten willst, solltest du nicht die Hälfte ignorieren, sondern jeweils den Zeilenanfang lesen und danach entscheiden, was mit den restlichen Daten passieren soll (notfalls per getline() einlesen und dann aufteilen

    PS: Die Datums- und Zeitangaben kannst du per find() und substr() in die einzelnen Ziffernblöcke zerlegen und dann umwandeln (siehe FAQ).



  • THX 👍 🙂


Anmelden zum Antworten