dateien in vektor speichern
-
std::ifstream rd("data.txt");
std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec));
std::cout << rd.rdbuf() << std::endl;[/cpp]
CStoll schrieb:
copy(istreambuf_iterator<char>(datei),istreambuf_iterator<char>(),back_inserter(my_vec));
(das hängt den Dateiinhalt hinten an den vector dran, also eventuell vorher den bisherigen Inhalt vernichten)
danke, aber es gibt nun ein neues problem:
Ich kann die Datei nicht in der Konsole sehen
std::ifstream rd("data.txt"); std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec)); std::cout << rd.rdbuf() << std::endl;
so würde es in der konsole ausgegeben:
std::ifstream rd("data.txt"); // nur wird hier nichts in den Vector kopiert :( std::cout << rd.rdbuf() << std::endl;
mfg
-
Nach dem Einlesen in den vector steht der Lesezeiger der Datei auf deren Ende - dahinter gibt's nichts mehr, was noch angezeigt werden könnte.
Lösung a: Du gibst den Inhalt des vector<> aus (
copy(myvec.begin(),myvec.end(),ostream_iterator<char>(cout));
).
Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).
-
[quote="CStoll"]
Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (**seekg()).[/**quote]?
Mfg
-
streammmmmmer schrieb:
CStoll schrieb:
Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).
?
Mfg
Wenn du es ganz genau willst:
rd.seekg(0);
setzt den Lesezeiger der Datei wieder auf Anfang. (ich hatte ja gehofft, daß dir das Stichwort ausreicht, um selber zu suchen ;))PS: Das Zitieren üben wir nochmal - ja?
-
CStoll schrieb:
streammmmmmer schrieb:
CStoll schrieb:
Lösung b: Du fährst die Datei zurück auf den Anfang, bevor du nochmal versuchst sie auszugeben (seekg()).
?
Mfg
Wenn du es ganz genau willst:
rd.seekg(0);
setzt den Lesezeiger der Datei wieder auf Anfang. (ich hatte ja gehofft, daß dir das Stichwort ausreicht, um selber zu suchen ;))hab es leider versucht, schaff es leider aber irgendwie noch immer nicht
Laut diesem Tutorial hab ich es auch gelesen, nur funktioniert bei mir das ja nicht, so wie ich es mir gedacht hätte:std::ifstream rd("data.txt"); std::vector<char> myvec; // Keine Zuweisung, da es sich im privaten Bereich einer Klasse befindet. std::copy(std::istreambuf_iterator<char>(rd),std::istreambuf_iterator<char>(),back_inserter(myvec)); std::cout << rd.rdbuf() << std::endl; rd.seekg(0);
error C2039: 'seakg': Ist kein Element von 'std::basic_ifstream<_Elem,_Traits>'
CStoll schrieb:
PS: Das Zitieren üben wir nochmal - ja?
Ja
Sorry, aber in der "Vorschau" hat es richtig ausgeschaut und da war ich wohl zu müde nachzuschauen, ob die Tags stimmen.Mfg
PS: ich hab jetzt bis geschlafen^^
-
Du mußt es auch schon richtig abschreiben (trotz Müdigkeit):
rd.seekg(0);
s. deine Fehlermeldung...
-
danke für eure Hilfe, alles hat geklappt
Mfg
-
Was ist der Unterschied zwischen istream_iterator und istreambuf_iterator?
-
Michael E. schrieb:
Was ist der Unterschied zwischen istream_iterator und istreambuf_iterator?
Hallo Michael,
der Unterschied ist der, dass man mit istreambuf_iterator nur Zeichen aus dem - dem istream unterlagerten - Streambuf liest und mit istream_iterator werden Typen aus einem istream inklusive der Formatierung und Interpretation gelesen.
Beispiel:
#include <algorithm> // copy #include <iostream> #include <iterator> // *_iterator #include <sstream> // istringstream #include <string> int main() { using namespace std; string buf("\t3.9 -2.0\n1.1E+2"); { // -- alle Zeichen istringstream input( buf ); copy( istreambuf_iterator< char >( input ), istreambuf_iterator< char >(), ostream_iterator< char >( cout << "1: [", "|" ) ); cout << "]\n" << endl; } { // -- alle Zeichen, ohne Whitespace istringstream input( buf ); copy( istream_iterator< char >( input ), istream_iterator< char >(), ostream_iterator< char >( cout << "2: [", "|" ) ); cout << "]\n" << endl; } { // -- Zahlen istringstream input( buf ); copy( istream_iterator< double >( input ), istream_iterator< double >(), ostream_iterator< double >( cout << "3: [", "|" ) ); cout << "]\n" << endl; } return 0; }
Die Ausgabe ist:
1: [ |3|.|9| |-|2|.|0| |1|.|1|E|+|2|] 2: [3|.|9|-|2|.|0|1|.|1|E|+|2|] 3: [3.9|-2|110|]
Im ersten Fall wird Zeichen für Zeichen gelesen; im zweiten nur jedes 'lesbare' Zeichen - also formatiert - und im dritten Fall werden die Zahlen auch als solche interpretiert. Das formatierte Lesen und interpretieren ist nur mit dem istream(_iterator) möglich, während der istreambuf(_iterator) nur die 'nackten' Zeichen liest.
Gruß
Werner
-
Danke für die gute Erklärung