txtdatei in string kopieren



  • hi,

    ich will eine textdatei in einen string kopieren. mein gegenwärtiger code wäre

    std::ifstream ifstr("bla.txt");
    std::string m_vertexSrc;
    
    std::copy( std::istream_iterator<char>(ifstr), std::istream_iterator<char>(), back_inserter(m_vertexSrc) );
    

    leider wurden dabei alle leerzeichen gekillt, also habe ich noch

    ifstr >> std::noskipws;
    

    davor gehängt. nun stimmen die leerzeichen aber ich habe auch alle zeilenumbrüche drinnen. wie kann ich das in einem rutsch machen und nur die leerzeichen haben, nicht aber die zeilenumbrüche? ich will nach möglichkeit den string nicht nachbearbeiten, sondern es über std::copy oder ähnliches machen.

    danke euch und gruß



  • Wenn du die Zeilenumbrüche durch Leerzeichen ersetzen willst,

    char convert_linebreaks(char c) {
      return c == '\n' ? ' ' : c;
    }
    
    // ...
    
    std::transform(std::istream_iterator<char>(ifstr),
                   std::istream_iterator<char>(),
                   std::back_inserter(m_vertexSrc),
                   convert_linebreaks);
    

    Ansonsten,

    std::string zeile;
    
    while(std::getline(ifstr, zeile)) {
      m_vertexSrc += zeile;
    }
    


  • danke dir. habs über das transform gemacht. werde irgedwann mal testen, welches von beiden flotter ist.



  • Schaue Dir mal den istreambuf_iterator an.

    std::ifstream ifstr("bla.txt");
    std::string m_vertexSrc;
    std::copy( std::istreambuf_iterator<char>(ifstr), std::istreambuf_iterator<char>(), back_inserter(m_vertexSrc) );
    

    Der überspringt keine Leerzeichen. Ansonsten möglicherweise effizienter ist:

    std::ifstream ifstr("bla.txt");
    std::ostringstream s;
    s << ifstr.rdbuf();
    std::string m_vertexSrc = s.str();
    

    Tntnet



  • also ohne

    ifstr >> std::noskipws;
    

    davor hat er es gemacht. ich gehe auch nicht davon aus, das der iterator das macht sondern der stream.

    und deinen vorschlag werde ich dann beim testen auch berücksichtigen. ich gebe dann hier nochmal feedback.


Anmelden zum Antworten