getline und Zeilenumbrüche



  • Ich bin gerade am Rätseln, wie so der folgende Code bei unterschiedlichen Compilern und unterschiedlichen Zeilenumbrüchen unterschiedliche Ergebnisse bringt (OS ist Windows):

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        std::fstream stream("path/to/test/file");
    
        string linestr = "";
        while (linestr.find("1") == string::npos && stream)
        {
            getline(stream, linestr);
        }
        // Now stream pos should be 1st char in next line
        // Just for debugging:
        const std::fstream::pos_type pos1 = stream.tellg();
        std::cout << pos1 << "\n";
        // End debugging
        // Read line
        getline(stream, linestr);
        cout << linestr << "\n";
        // final debugging:
        // Reset stream position
        stream.seekg(pos1);
        // and read again
        getline(stream, linestr);
        cout << linestr << "\n";
        return 0;
    }
    

    Meine testdatei schaut so aus, mit CRLF und LF als Zeilenumbruch:

    0
    1
    23456789
    
    

    Hier die Ausgaben:

    • CRLF:
      ** MingW 7.3, 64bit:
      7
      23456789
      3456789
      ** MSVC2017, 32bit:
      6
      23456789
      23456789
      ** MSVC2017, 64bit:
      6
      23456789
      23456789

    • LF:
      ** MingW 7.3, 64bit:
      4
      23456789
      23456789
      ** MSVC2017, 32bit:
      3
      23456789
      ** MSVC2017, 64bit:
      3
      23456789

    Hintergrund ist, dass ich eine Datei bis zu einem bestimmten Token als Header einlese, und dann den Rest als Daten. Datei reiche ich einfach den Stream von einem Programmteil auf den nächsten weiter, aber je nach Compiler und Zeilenumbruch geht das in die Hose..
    Was mache ich da falsch?



  • Dein Vergleich zwischen MSVC 32bit und 64bit ist m. E. nach sinnlos, da die sich nicht unterscheiden.

    Ich nehme an, dass tellg() die EOL konvertierung nicht "beachtet", d. h. die tatsächliche position zurück gibt. Da also keine Überraschung. Die einzige Überraschung ist, dass GCC die Position 7 gibt, da eigentlich die Position 6 sein müsste. Man müsste das mal auf Linux und GCC testen. Evtl. ein Compiler Bug.


Anmelden zum Antworten