Vector aus Klasse fester größe zuweisen
-
moin, wie kann ich das hier besser lösen?
Ich benutze hier ja 2 Vectoren eigentlich würde ja einer reichen aber ich weiss nicht wie ich dem Vector daten aus meiner Klasse eine festgröße zuweisen kann.
Ich hab schon verschiedene Sachen ausprobiert aber alles ohne Erfolg.
#include <iostream> #include <vector> #include <fstream> using namespace std; class COPY { public: vector<char>daten; COPY(); }; COPY :: COPY () { } int main(int argc, char* argv[]) { COPY copy; long FileSize; ifstream file ("datei.bin",ios::binary); file.seekg(0,ios::end); FileSize = file.tellg(); file.seekg(0,ios::beg); vector<char>MainVector(FileSize); file.read( &MainVector[0], FileSize ); for(int i=0;i<FileSize;i++) { copy.daten.push_back( MainVector[i] ); } return 0; }
-
Bevor ich deine technische Frage beantworte: Was möchtest du erreichen? Eine Datei zu kopieren geht einfacher als über drei Umwege, da brauchst du gar keine Vectoren. Also: Was soll das Programm hinterher machen?
-
Du kannst direkt in den Vektor lesen:
#include <vector> #include <iostream> int main() { std::vector<char> FileData; FileData.resize( <FileSize> ); ifstream file( <FileName> ); std::copy( FileData.begin(), istream_iterator<char>( file ), istream_iterator<char>() ); }
-
DocShoe schrieb:
Du kannst direkt in den Vektor lesen:
#include <vector> #include <iostream> int main() { std::vector<char> FileData; FileData.resize( <FileSize> ); ifstream file( <FileName> ); std::copy( FileData.begin(), istream_iterator<char>( file ), istream_iterator<char>() ); }
Er kann auch direkt in den Output-Stream (der Stream über den die Datei kopiert wird) lesen.
-
Kopieren wollte ich die Datei eigentlich nicht ich hab die Klasse nur so genannt war vielleicht etwas blöd gewählt der Klassennamne ...
Mir geht es nur um den Vector.
#include <iostream> #include <vector> #include <fstream> #include <iterator> using namespace std; int main() { std::vector<char> FileData; FileData.resize( 4 ); ifstream file( "datei.txt"); std::copy( FileData.begin(), istream_iterator<char>( file ), istream_iterator<char>() ); return 0; }
Bei dem Code sagt mein Compiler:
[C++ Fehler] Unit1.cpp(13): E2285 Keine Übereinstimmung für 'copy<_InputIter,_OutputIter>(char *,istream_iterator<char,char,char_traits<char>,int>,istream_iterator<char,char,char_traits<char>,int>)' gefunden
Ich hab mit der iterator Klasse bisher noch nicht wirklich viel gemacht daher hab ich kp was der Compiler damit jetzt meint. ( Die iterator Klasse ist mir neu ich hab mal von gehört aber noch nicht damit gearbeitet. )
-
DocShoe schrieb:
std::copy( FileData.begin(), istream_iterator<char>( file ), istream_iterator<char>() ); }
Das ist dann aber ein formatierter Lesevorgang, wesentlich langsamer als ein read.
-
DerVector schrieb:
Kopieren wollte ich die Datei eigentlich nicht ich hab die Klasse nur so genannt war vielleicht etwas blöd gewählt der Klassennamne ...
Mir geht es nur um den Vector.
Damit ist immer noch nicht klar, was du erreichen möchtest, daher kann ich nur spekulieren:
#include <vector> #include <fstream> #include <string> #include <iostream> class binary_file { std::vector<char> data; typedef std::vector<char>::size_type size_type; public: binary_file(std::string const &filename) { std::ifstream file(filename, std::ios::binary); // Oder filename.c_str() in C++98 read_file(file); } void read_file(std::ifstream& file) { file.seekg(0, std::ios_base::end); std::streampos length = file.tellg(); data.resize(length); file.seekg(0, std::ios_base::beg); file.read(data.data(), length); // Oder &data[0] in C++98 } char &operator[](size_type i) {return data[i];} char const &operator[](size_type i) const {return data[i];} friend std::ostream& operator<<(std::ostream &out, binary_file const& file) { return out.write(file.data.data(), file.data.size()); // Siehe oben zu data() } }; int main() { binary_file file("test.cpp"); std::cout << file; }
-
Mit der resize Funktion konnte ich mein Problem lösen.
Ich wusste einfach nicht wie ich den Vector vergrößern kann im Hauptprogramm da lag mein Problem.
#include <iostream> #include <vector> #include <fstream> using namespace std; class Klasse { public: vector<char>daten; }; int main(int argc, char* argv[]) { Klasse kla; long FileSize; ifstream file ("datei.txt",ios::binary); file.seekg(0,ios::end); FileSize = file.tellg(); file.seekg(0,ios::beg); kla.daten.resize( FileSize ); file.read( &kla.daten[0] , FileSize ); cout<< &kla.daten[0] << endl; return 0; }
Btw. ist das C++ 11 ?
file.read(data.data(), length);
-
Super, jetzt hast du eine Klasse namens Klasse mit einem Attribut, das auch noch public ist
.
DerVector schrieb:
Btw. ist das C++ 11 ?
file.read(data.data(), length);
Das vector::data() gibt es erst seit C++11.