Gesamten Datei-Inhalt in String?



  • jo ... wo ist das Problem? Ist doch einigermaßen elegant 🙂

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
        std::cout << "Crypt V0.1 Beta" << std::endl;
        std::cout << "Filename: " << std::flush;
        std::string string_line;
        std::getline(std::cin, string_line);
        std::ifstream f_stream(string_line.c_str(), std::ios::in);
        if (!f_stream)
        {
            std::cout << "ERROR: File (\"" << string_line << "\") not found!" << std::endl;
            return -1;
        }
        std::string content;
        while(std::getline(f_stream, string_line)
            content += string_line;
    
        std::cout << "Encrypt begin" << std::endl;
        std::cout << "Content: \"" << content << "\" << std::endl;
        std::cout << "Encrypt end" << std::endl;
    
        f_stream.close();
    }
    

    wie immer... nicht getestet ... sollte aber gehen 🙂



  • Hi, alles was du willst sollte damit funktionieren und keine Schwierigkeiten bereiten:

    #include <iterator>
    
    ifstream file("xx.txt");
    string fileText = string(istreambuf_iterator<string>(file),istreambuf_iterator<string>());
    


  • Oh, danke 😃

    Mach es jetzt so wie Karldin gepostet hat. Ist eigentlich das einfachste...

    @KasF:
    Öhm, das versteh ich überhaupt nicht. 😮
    Zumal es bei Dev-C++ nicht funktioniert. Gibts das wieder nur bei Borland oder MS Visual?

    Sieht aber interessant aus und ist immerhin kürzer...



  • pixelflat schrieb:

    Zumal es bei Dev-C++ nicht funktioniert.

    Was heißt funktioniert nicht ??? Hast du auch die anderen includes ( string,fstream) drin?



  • Ja, natürlich. Hab auch #include <iterator> nicht vergessen.

    //Edit
    Muss ich irgendwas ersetzen?
    Hab sowas wie "istreambuf_iterator<string>(file)" noch nie gesehn...

    Ach ja, wie siehts denn jetzt mit der Größe aus. Mal angenommen ich will eine größere Datei (paar hundert Zeilen) einlesen. Geht das dann auch noch mit den Strings?



  • Ach verdammt 🙂
    So:

    string fileText = string(istreambuf_iterator<char>(file),istreambuf_iterator<char>());
    

    std::string besorgt sich bei Bedarf seinen Speicher vom Heap. Dh er ist "schlicht unerschöpflich".

    Edit->Erklärung:
    Stell dirs so vor: iteratoren sind Objekte die dich durch irgendwas führen können. Sagen wir mal ein iterator ist ein Zugführer. Nun braucht er seinen Zug das ist dann istreambuf ( beachte ähnlichkeit mit ifstream ).

    Unsere Zug musst natürlich mit etwas gefüllt sein. Das ist in dem Falle deine TextDatei file. Nun soll der Zugführer mit seinen Hyper-Staubsauger durchgehen und alle Teilchen aus dem Zug ( im Zug sind nur char's-[in der Datei sind nur char's]) aufsaugen. Damit beginnt er von vorne, um aber zu wissen wann Schluss ist zeigen wir im auch einen leeren Zug, damit er weiß wie sowas aussieht -> istreambuf_iterator<char>().

    Nun läuft er einmal durch, saugt alles ein und übergibt es string 😉
    👍

    [Märchenstunde Ende]



  • Ok, dann passt das ja wegen der Größe.

    Und es funktioniert jetzt auch. 😃
    Gefällt mir...

    Mal schaun, wann das Kapitel mit Iteratoren kommt - ist ja praktisch. Danke!



  • gabs mal ne heftige diskussion im C-Forum über cast von EOF nach char aber so klappts jedenfalls dass man alles auf einen rutsch einliest:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
    	std::ifstream is("blablabla.txt");
    	std::string buf;
    	if(!is.is_open())
    		return 1;
    	std::getline(is, buf, static_cast<char>(EOF));
    	std::cout<<buf<<std::endl;
    	return 0;
    }
    


  • pixelflat schrieb:

    Mal schaun, wann das Kapitel mit Iteratoren kommt - ist ja praktisch.

    Siehe Edit 😉



  • Ah - verstanden! Schön erklärt...

    @...
    Ist bei getline der 3. Paramter nicht das Zeichen, bis zu dem eingelesen wird?



  • KasF schrieb:

    Ach verdammt 🙂
    So:

    string fileText = string(istreambuf_iterator<char>(file),istreambuf_iterator<char>());
    

    Du erzeugst zuerst ein temporäres string-Objekt und dann weißt du das dem Objekt fileText zu.

    Ein Compiler kann den Code normal optimieren, da er die STL kennt.

    Aber besser wäre:

    string fileText((istreambuf_iterator<char>(file)),istreambuf_iterator<char>());
    


  • lolz schrieb:

    Aber besser wäre:

    string fileText((istreambuf_iterator<char>(file)),istreambuf_iterator<char>());
    

    Wenn du jetzt nen cout << filetext machen würdest käme 0 oder 1 oder so raus.

    http://www.gotw.ca/gotw/075.htm 😉



  • KasF schrieb:

    lolz schrieb:

    Aber besser wäre:

    string fileText((istreambuf_iterator<char>(file)),istreambuf_iterator<char>());
    

    Wenn du jetzt nen cout << filetext machen würdest käme 0 oder 1 oder so raus.

    http://www.gotw.ca/gotw/075.htm 😉

    Ne, lolz hat doch extra Klammern um den ersten Parameter gesetzt, die um einen Typ nicht zulässig wären.



  • Oh, sorry habe die Klammern nicht gesehen ...



  • pixelflat schrieb:

    Ah - verstanden! Schön erklärt...

    @...
    Ist bei getline der 3. Paramter nicht das Zeichen, bis zu dem eingelesen wird?

    exakt! und das soll genau das Dateiende-Zeichen sein. aber wie gesagt da gabs im C forum nen thread "Datei operationen" hiess der glaube ich. da gings 5 seiten nur um das EOF gequatsche und anscheinend is der cast, also der dritte Parameter, in der Form nich so das wahre.



  • Hallo,
    ich hab hier noch ein Problem.

    Wie kann ich anstatt des Dateinamens, einen String verwenden?

    string pfad;
    getline(cin, pfad);
    ifstream file(pfad);
    string fileText((istreambuf_iterator<char>(file)),istreambuf_iterator<char>());
    

    So funktionierts anscheinend nicht. -.-

    //Edit
    Wenn ich aus dem String "pfad" ein Char-Array mache, funktionierts zwar, aber das Programm bricht dann später einfach ab...

    //Edit
    Ok, das mit dem Abbrechen lag an einer falschen Deklaration des Char-Arrays.
    Kann ich in ein Char-Array auch eine Zeile (also incl. Leerzeichen) einlesen, wie bei getline?
    Bei cin >> pfad; wird ja nur ein Wort (bis zum LZ) eingelesen.





  • std::string file_path;
    std::getline(std::cin, file_path);
    std::ifstream file_stream(file_path.c_str(), std::ios::in);
    
    if (!file_stream)
        return false;
    
    std::string file_content((std::istreambuf_iterator<char>(file_stream)), std::istreambuf_iterator<char>());
    file_stream.close();
    


  • ifstream file(pfad.c_str());
    


  • @KasF:
    Einfach perfekt! 😉


Anmelden zum Antworten