.log Sortieren ??



  • Und wir sollen jetzt raten, was du geschrieben hast? Zeig doch einfach etwas Code - mit einer konkreten Frage (oder Compilermeldung), dann können wir auch weiterhelfen.



  • Nein, sollte keiner raten 🙂

    Bastel ja noch 🙄



  • int main ( )
    {
    
    	int num;
    	vector<string> vect;
    	ifstream quelle;												
    
    	quelle.open("text.log", ios_base::in);						// Datei öffnen
    
    	if (!quelle){												// Datei nicht gefunden
    				cerr << "no file available\n";					// Fehlerausgabe
    				}	
    
    	else		{
    
    				quelle.getline (num, 4)
    
    					// wie nun richtig an vector übergeben? (mit push_back)
    

    so bin Mittag machen, Mahlzeit!

    und danke für alles :p



  • Erstmal: getline() mit einem int zu verwenden geht schonmal nicht - die istream-Methode arbeitet mit char-Arrays, die globale Funktion mit strings.

    Zweitens: getline() liest genau eine Zeile ein - um die gesamte Datei zu bekommen, mußt du es in einer Schleife aufrufen.

    string zeile;
    while(getline(quelle,zeile))//das liest so lange, bis es auf Fehler bzw. EOF trifft
      vect.push_back(zeile);
    

    Drittens: Ja, push_back() ist richtig.



  • beim getline wollte ich tricksen, aber hab gemerkt, dass es 1.nicht geht und 2.schwachsinn war - danke 😃

    edit// oja, bestens. hat soweit funktioniert 👍

    jetzt mach ich mich mal an das sortieren 🙄



  • #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct entry
    {
       int nr;
       string log;
    };
    class Compare
    {
    public:
        bool operator()( const entry& en1, const entry& en2 )
        {
            return en1.nr < en2.nr;
        }
    };
    int main()
    {
        ifstream in("log.txt");
        string buff;
        entry neueintrag;
        vector <entry> log;
        while(!in.eof())
        {
          getline(in,buff,'.');
          neueintrag.nr = atoi(buff.c_str());
          getline(in,buff);
          neueintrag.log = buff;
          log.push_back(neueintrag);
        }
        in.close();
        sort(log.begin(),log.end(),Compare());
        for(unsigned i=0;i<log.size();i++)
        {
          cout << log[i].nr << " " << log[i].log <<endl;
        }
        cin.get();
        return 0;
    }
    


  • ouh, sehr nice.

    danke vielmals, war schon fast zu viel des guten.. 🙄

    funzt aber nicht zu 100% 😃

    ich bastel mal weiter 😉



  • myFile.open schrieb:

    funzt aber nicht zu 100% 😃

    wo ist denn das Problem?

    Wenn Du fleißig übst, Dich auch in die Geheimnisse der STL einarbeitest, dann kannst Du bald auch solche Programme hinschreiben.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <algorithm>    // sort
    #include <iterator>     // i/ostream_iterator<>
    
    struct entry
    {
        int m_nummer;
        std::string m_restText;
    };
    // --   Entry lesen
    std::istream& operator>>( std::istream& in, entry& e )
    {
        return std::getline( in >> e.m_nummer, e.m_restText );
    }
    // --   Entry schreiben
    std::ostream& operator<<( std::ostream& out, const entry& e )
    {
        return out << e.m_nummer << e.m_restText << std::endl;
    }
    
    class Compare
    {
    public:
        bool operator()( const entry& en1, const entry& en2 ) const
        {
            return en1.m_nummer < en2.m_nummer;
        }
    }; 
    
    int main()
    {
        std::ifstream quelle( "log.txt" );
        if( !quelle.is_open() )
        {
            std::cerr << "Fehler beim Oeffnen der Datei" << std::endl;
            return -1;
        }
        std::vector< entry > log( (std::istream_iterator< entry >( quelle )), (std::istream_iterator< entry >()) );
        std::sort( log.begin(), log.end(), Compare() );
        std::copy( log.begin(), log.end(), std::ostream_iterator< entry >( std::cout ) );
        return 0;
    }
    

    Du siehst das Lesen, sortieren und ausgeben ist jeweils eine Zeile Code. Die kleinen Helferlein nicht mitgerechnet 😉

    Gruß
    Werner



  • lässt sich aber leider nicht compilieren. 😞
    Hängt in der Zeile

    std::vector< entry > log( (std::istream_iterator< entry >( quelle )), (std::istream_iterator< entry >()) );
    

    (Compiler meldet Ausdruckssyntax)



  • lern_ender schrieb:

    lässt sich aber leider nicht compilieren.

    welchen Compiler benutzt Du?

    falls es eine Version 6 einer bekannten großen Softwarefirma ist, so geht es nicht. Ändere dann die Zeile 41 nach

    std::vector< entry > log;
        std::copy( (std::istream_iterator< entry >( quelle )), std::istream_iterator< entry >(), std::back_inserter( log ) );
    

    Gruß
    Werner



  • Ich würde nicht die Zeile ändern, sondern die Versionsnummer des Compilers ändern. 😉



  • Artchi schrieb:

    Ich würde nicht die Zeile ändern, sondern die Versionsnummer des Compilers ändern. 😉

    Würde ich ja gerne. Leider macht mein Chef da nicht mit.
    Warum hat der BCB denn damit ein Problem ?



  • Weil er wahrscheinlich nicht gerade sehr ISO-C++-konform zu sein scheint. Verrate uns doch mal deinen Compiler und Versionsnummer...



  • Borland Builder 6 (Build 10.166)



  • sehr nett leute, danke


Anmelden zum Antworten