.txt Datei - Jede zweite Zeile "auslassen"


  • Mod

    Bitte schreib nicht so etwas:

    std::getline( file, line )
     if( line[4] == 'n' )
       // ...
    

    Das schreit ja geradezu nach Ärger. Besser:

    std::getline( file, line )
     if( line.length() > 4 && line[4] == 'n' )
       // ...
    


  • SeppJ schrieb:

    Das schreit ja geradezu nach Ärger. Besser:

    std::getline( file, line )
     if( line.length() > 4 && line[4] == 'n' )
       // ...
    

    Das ist auch nicht richtig, wenn der Stream in einem Fehlerstatus ist.

    http://ideone.com/i0d1P6


  • Mod

    Schreihals schrieb:

    SeppJ schrieb:

    Das schreit ja geradezu nach Ärger. Besser:

    std::getline( file, line )
     if( line.length() > 4 && line[4] == 'n' )
       // ...
    

    Das ist auch nicht richtig, wenn der Stream in einem Fehlerstatus ist.

    http://ideone.com/i0d1P6

    Das ist nur als ungefähre Richtungsangabe zu verstehen, ich wollte jetzt nicht noch eine weitere Ebene an Abfragen hinzu fügen. Aber guter Hinweis an Leute, die das Beispiel zu wörtlich genommen hätten.



  • Hallo,

    Caligulaminus schrieb:

    HarteWare schrieb:

    Der vector bleibt leider leer[..]

    Klar, Du ignorierst ja auch nicht die Zeile, die Du geprüft hast.

    Wie ist das zu verstehen? So? Denke ich hab das so falsch verstanden...

    std::string line;
        while( std::getline(file,line) )
        {
            if( line.length() > 4 && line[4] == 'n')
            {
                temp_lines.push_back( line ); // move ist optional
                file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
            }
            file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
        }
    

    Stimmt, das Programm ist relativ gesehen recht unzuverlässlich und auch nicht wirklich universell verwendbar, aber ich möchte es nur für eine ganz bestimmte Aufgabe. Aber Danke für die Hinweise, nichts spricht dagegen sauber zu arbeiten.

    mfg
    HarteWare



  • Der stream hat einen Marker für die aktuelle Leseposition.
    Bei getline(..., '\n') wird der Marker auf die nächste Zeile gesetzt (und der Inhalt zwischen der vorherigen Position und der aktuellen in einen String gespeichert).
    Bei ignore(..., '\n') wird der Marker (nur) auf die nächste Zeile gesetzt.

    Gegeben sei folgender Dateiinhalt:

    0123m
    0123n
    0123o
    

    Wo steht der Lesemarker nach dem ersten Schleifendurchlauf? Welchen Inhalt hat line?
    Wie sieht es nach dem zweiten Durchlauf aus?

    std::string line;
        while( std::getline(file,line) )
        {
            if( line.length() > 4 && line[4] == 'n')
            {
                temp_lines.push_back( line ); // move ist optional
                file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
            }
            file.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
        }
    

    Fällt Dir was auf?



  • std::string mystring;
    mystring = "blablabla"

    if(mystring[3] == 'a')
    writeToFile(mystring);



  • Namenloser324 schrieb:

    std::string mystring;
    mystring = "blablabla"

    if(mystring[3] == 'a')
    writeToFile(mystring);

    oh lol hab die zweite Seite nicht gesehen haha einfach ignorieren



  • Furble Wurble schrieb:

    Gegeben sei folgender Dateiinhalt:

    0123m
    0123n
    0123o
    

    Wo steht der Lesemarker nach dem ersten Schleifendurchlauf? Welchen Inhalt hat line?
    Wie sieht es nach dem zweiten Durchlauf aus?

    Fällt Dir was auf?

    Hallo,

    Also als erstes fällt mir auf, dass dieser Thread theoretisch nach Natans Post schon hätte gelöst sein sollen, jedoch ist dem in der Praxis nicht so... 😞
    Na gut:
    Nach dem ersten Durchlauf:

    0123m
    0123n 
    0123o <- Lesemarker
    Inhalt: "0123m"
    

    Nach dem Zweiten:
    nada, std::getline wird fehlschlagen

    while( getline( file, line )) // Diese Zeile schlägt fehl. Habs getestet. 
    
    //======================================
    while( std::getline( file, line ))
    {
        std::cout << line << '\n';
    }
    

    Output:

    Press <RETURN> to close this window...
    

    Ich finds echt toll, das so durchhaltend versucht wird mir zu helfen

    mfg
    HarteWare



  • HarteWare schrieb:

    Also als erstes fällt mir auf, dass dieser Thread theoretisch nach Natans Post schon hätte gelöst sein sollen, jedoch ist dem in der Praxis nicht so... 😞
    Na gut:
    Nach dem ersten Durchlauf:

    0123m
    0123n 
    0123o <- Lesemarker
    Inhalt: "0123m"
    

    Nach dem Zweiten:
    nada, std::getline wird fehlschlagen

    Sicher?
    Hast Du's mal ausprobiert?

    HarteWare schrieb:

    while( getline( file, line )) // Diese Zeile schlägt fehl. Habs getestet. 
    
    //======================================
    while( std::getline( file, line ))
    {
        std::cout << line << '\n';
    }
    

    Output:

    Press <RETURN> to close this window...
    

    Das sollte eigentlich jede Zeile eines Files ausgeben.
    Wenn Du jetzt noch die gesuchten Zeilen in einen Vektor einfügst ist die Aufgabe doch gelöst?!



  • oh man... kann es sein, dass es ihm net passt, wenn vor jeder Zeile im Dokument noch en bissle whitespace ist? Naja das Einlesen hat sich nun geklärt...

    Ich möcht mich nochmals bei allen Helfenden bedanken 👍

    mfg
    HarteWare


Anmelden zum Antworten