Gesamten Datei-Inhalt in String?
-
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.
-
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.
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!
-
Nochmal zur eigentlichen Frage. Um eine Datei einzulesen kann man den relativ unbekannten operator<< (std::ostream&, std::streabuf*) verwenden:
std::ifstream datei(datename); std::ostringstream s; s << datei.rdbuf(); std::string meinDateiinhalt = s.str();
-
tntnet schrieb:
Nochmal zur eigentlichen Frage. Um eine Datei einzulesen kann man den relativ unbekannten operator<< (std::ostream&, std::streabuf*) verwenden:
std::ifstream datei(datename); std::ostringstream s; s << datei.rdbuf(); std::string meinDateiinhalt = s.str();War bis dato auch mein bevorzugte Variante für sowas. Aber anders habe ich einen stringstream gespart

-
Also, da ich jetzt mit deiner Methode (KasF) die Datei auslese...
Kann ich so auch in die Datei schreiben?
-
pixelflat schrieb:
Also, da ich jetzt mit deiner Methode (KasF) die Datei auslese...
Kann ich so auch in die Datei schreiben?
ofstream outfile("...txt"); copy(mystring.begin(),mystring.end(),ostream_iterator<char>(outfile));