Inhalt aus Datei lesen



  • Welche Klasse sollte man benutzen um lesend auf eine Datei zuzugreifen?
    Wie kann ich den gesamten Inhalt auf einmal auslesen?


  • Mod

    asfsagsdgsg schrieb:

    Welche Klasse sollte man benutzen um lesend auf eine Datei zuzugreifen?

    std::ifstream

    Wie kann ich den gesamten Inhalt auf einmal auslesen?

    Kommt drauf an, wo der Inhalt landen soll. In Frage kommt vieles, von rd_buf über read zu istream_iteratoren oder einfach eine gute alte Leseschleife bis das Lesen fehlschlägt (d.h. in der Regel am Dateiende).



  • Der Inhalt soll einfach in einem std::string gespeichert werden, denke da reicht einfach read bis EOF?



  • asfsagsdgsg schrieb:

    Der Inhalt soll einfach in einem std::string gespeichert werden, denke da reicht einfach read bis EOF?

    Am effektivsten sind diese beiden Varianten:

    // Variante 1:
         ifstream file("test.txt");
         string str(static_cast<stringstream const&>(stringstream() << file.rdbuf()).str());
    

    und

    // Variante 4: istreambuf_iterator + ostreambuf_iterator
        ifstream file("test.txt");
        string str( (istreambuf_iterator<char>(file)), (istreambuf_iterator<char>()) );
    

    Beide Varianten dürften gleich schnell sein.



  • sry, da sollte natürlich Variante 2: stehen (war noch aus nem alten thread).


  • Mod

    Da fände ich ein einfaches read aber wesentlich lesbarer und ist genau so schnell. Es könnte sogar minimal schneller sein, weil man sich Reallokationen spart.



  • SeppJ schrieb:

    Da fände ich ein einfaches read aber wesentlich lesbarer und ist genau so schnell. Es könnte sogar minimal schneller sein, weil man sich Reallokationen spart.

    Würdest du diese Variante kurz machen und postenbitte, bei mir mag es gerade nicht funktionieren. 🙂



  • out schrieb:

    SeppJ schrieb:

    Da fände ich ein einfaches read aber wesentlich lesbarer und ist genau so schnell. Es könnte sogar minimal schneller sein, weil man sich Reallokationen spart.

    Würdest du diese Variante kurz machen und postenbitte, bei mir mag es gerade nicht funktionieren. 🙂

    Ok, habs doch noch hinbekommen. Also hier noch, die von SeppJ angesprochene, Variante 3:

    // Variante 3: read
            ifstream file("test.txt");
    		string str;
            char buffer[8192];
    		while( file.read(buffer, sizeof(buffer)), file.gcount()>0 )
    		{
    			str.append(buffer, sizeof(buffer));
    		}
    

    Sie ist in der Tat etwas schneller.


  • Mod

    Ich hätte ja jetzt gleich den string auf die Dateigröße resized(bzw. sofort mit dieser Größe erstell) und dann gnadenlos direkt in diesen String geschrieben. Wenn die 8k-Blöcke schon noch etwas gebracht haben, dann wird dies nochmal schneller sein.



  • std::string FileReader::get_file_content(std::string &file) const {
    
    	std::ifstream f(file);
    	std::string   content;
    
    	f.seekg(0, std::ios::end);
    	auto length = f.tellg();
    	f.seekg(0, std::ios::beg);
    
    	content.resize(length);
    	f.read(const_cast<char *>(content.c_str()), length);
    
    	return content;
    }
    

    Ist das so in Ordnung?
    Bezüglich des const_cast: Eigentlich sollte man sowas ja bleiben lassen, aber in diesem Fall dürfte das doch kein Problem darstellen, oder?



  • Wieso nicht einfach so?

    ifstream file("test.txt");
    		file.seekg (0, ios::end);
    		const size_t size = file.tellg();
    		file.seekg (0, ios::beg);
    
    		string str;
    		str.resize( size );
    		file.read( &str[0], size);
    


  • out schrieb:

    // Variante 3: read
            ifstream file("test.txt");
    		string str;
            char buffer[8192];
    		while( file.read(buffer, sizeof(buffer)), file.gcount()>0 )
    		{
    			str.append(buffer, sizeof(buffer));
    		}
    

    Wird hier nicht Dein String zu lang, wenn die Dateigröße nicht durch 8K teilbar ist?


Anmelden zum Antworten