Datei in einen String parsen



  • Gibt es eine Möglichkeit eine Datei mit einem Einzeiler in einen std::string zu parsen? evtl. über Boost? Danke



  • asdsad schrieb:

    Gibt es eine Möglichkeit eine Datei mit einem Einzeiler in einen std::string zu parsen? evtl. über Boost? Danke

    Meinst Du, die ganze Datei mit einem Schwupps in einen String einlesen?



  • Ja, quasi. Du kannst das über Iteratoren machen:
    http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring

    std::ifstream t("file.txt");
    std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
    // Die Klammern sind wichtig.
    

    Aber wenn du das wirklich öfter brauchst, bietet sich eine simple Funktion eher an:

    std::vector<char> readFile(const std::string &filename)
    {
        std::ifstream file;
        file.exceptions(std::ifstream::badbit | std::ifstream::eofbit | std::ifstream::failbit);
        file.open(filename, std::ios::binary);
        file.seekg(0, std::ios::end);
        std::vector<char> buf(static_cast<std::vector<char>::size_type>(file.tellg()));
        file.seekg(0, std::ios::beg);
        file.read(&buf[0], buf.size());
        return buf;
    }
    


  • volkard schrieb:

    asdsad schrieb:

    Gibt es eine Möglichkeit eine Datei mit einem Einzeiler in einen std::string zu parsen? evtl. über Boost? Danke

    Meinst Du, die ganze Datei mit einem Schwupps in einen String einlesen?

    Japs. Bei den Dateien handelt es sich um stylesheets die ich nicht einmal als Variable im selben Anweisungsblock brauche, ich gebe den String einfach weiter an Qt



  • cooky451 schrieb:

    ...

    Danke die habe ich auch gefunden. Ich dachte einfach dass es vielleicht schon Einzeiler gibt die ich so anwenden könnte:

    setStylesheet(filetostring("/styles/style.css"));
    

    ohne zusätzliche eigene Funktionen oder Zwischenvariablen einzuführen. In der Boost Bibliothek stecken ja öfters Schätze die darauf warten gefunden zu werden 🙂



  • So etwas gibt's im Standard nicht. Aber so eine 6 Zeilen Funktion kann man sich ja auch mal selbst schreiben. 😉



  • Vorsicht, damit das mit den Iteratoren richtig hinhaut (die benutzen operator>>) muss man vorher Whitespace-Skipping deaktivieren.

    Ansonsten werfe ich mal die stringstream-Variante in die Runde:

    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <string>
    
    std::string to_string(std::istream &in) {
      std::ostringstream buffer;
      buffer << in.rdbuf();
      return buffer.str();
    }
    
    std::string file_to_string(std::string const &filename) {
      std::ifstream in(filename.c_str());
      return to_string(in);
    }
    
    int main() {
      std::cout << file_to_string(__FILE__);
    }
    


  • Wenn du Qt benutzt, könntest du auch QFile::readAll benutzen.



  • asdsad schrieb:

    volkard schrieb:

    asdsad schrieb:

    Gibt es eine Möglichkeit eine Datei mit einem Einzeiler in einen std::string zu parsen? evtl. über Boost? Danke

    Meinst Du, die ganze Datei mit einem Schwupps in einen String einlesen?

    Japs. Bei den Dateien handelt es sich um stylesheets die ich nicht einmal als Variable im selben Anweisungsblock brauche, ich gebe den String einfach weiter an Qt

    Wenn du den String an QT gibst, dann nimm doch gleich QString und schlag dich nicht umständlich mit std::string rum.



  • seldon schrieb:

    Vorsicht, damit das mit den Iteratoren richtig hinhaut (die benutzen operator>>) muss man vorher Whitespace-Skipping deaktivieren.

    Ähm, nicht ganz, ein istreambuf_iterator verwendet sgetc, und das filtert nicht.



  • Ah, richtig. Da hab ich mich stumpf verlesen (dachte an istream_iterator). Entschuldigung.


Log in to reply