von char[512] nach ::std::vector<char> kopieren
-
hi,
ich habe eine serie von byte-records, jedes 512 bytes lang. die hätte ich gerne alle hintereinander in einem vector (oder ähnlichem).
string wäre natürlich praktisch, aber die daten sind binär und das geht ja nicht.ich hab schon www.sgi.com befragt, aber nichts gefunden...
also? tipps?
-
Wo kommst du denn nicht weiter?
-
#include <string> #include <stdio.h> typedef std::string String; String readrecord( FILE* fp ) { String buf; for ( int i=0; i < 512; ++i ) { int c = getc( fp ); if ( c == EOF ) break; buf += static_cast<char>( c ); } return buf; } // ... FILE* openfile( const char* name ) { return fopen( name, "rb" ); } // ...
-
SGI's STL schrieb:
template <class InputIterator>
vector(InputIterator, InputIterator)Creates a vector with a copy of a range.
Sowas?
-
also grundsätzlich wäre sowas gut:
for( int j= 0 ; j < filesize ; j+=RECORDSIZE ) { i.read(buffer, RECORDSIZE); ::std::copy( &buffer[0], &buffer[RECORDSIZE], content[j] ); }
nur sind zeiger ja keine iteratoren...
und @finix:
das sieht ganz toll aus, aber dann brauche ich ja schon einen std::vector um eine kopie zu machen. ich hab aber nen c-string. *heul*@xyz:
wäre auch nicht schlecht. aber leider gibts da '\0', das in binären dateien vorkommen kann. und das macht sich ganz schlecht in strings...
-
betrug schrieb:
nur sind zeiger ja keine iteratoren...
nein?
-
dumm nur,dass zeiger häufig als iteratoren benutzt werden
-
camper schrieb:
betrug schrieb:
nur sind zeiger ja keine iteratoren...
nein?
nicht dass ich wüsste
-
Ein Iterator ist ja nur ein Konzept und Zeiger erfüllen dies ziemlich gut
In Struppis Worten:
Bjarne Stroustrup schrieb:
ein Iterator ist eine Abstraktion...alles was sich wie ein Iterator verhält ist ein Iterator
-
kleiner tipp: insert bei vector/string benutzen.
-
betrug schrieb:
@xyz:
wäre auch nicht schlecht. aber leider gibts da '\0', das in binären dateien vorkommen kann. und das macht sich ganz schlecht in strings...doch, geht!
Die std::string-Klasse verarbeitet ja keine C-Strings, sondern ganz allgemein Zeichenketten, da duerfen auch Null-Bytes rein!
Natuerlich kommt dann bei str.c_str() ein Pointer auf den String-Puffer zurueck, der auch die Null-Bytes mit einschliesst. Wenn man's aber weiss, dass welche drin sind, kein Problem!
-
ja, ok, zeiger sind eine untermenge von iteratoren. aber es funktioniert trotzdem nicht
.
@insert:
void insert(iterator pos, InputIterator f, InputIterator l)
wenn das geht, dann würde auch das mit copy gehen.
na egal, ich kopier jetzt zeichenweise. so. hah.
(
)
(kriegt der chef hier eigentlich geld, wenn ich das buch über amazon kaufe???
)
-
Brauchst du überhaupt C(-Strings)?
Ansonsten könntest du evtl. direkt mit istream_iterator & back_insert_iterator was basteln...
-
warum liest du nicht einfach direkt in einen vector<char> ?
std::vector< char > content( filesize ); i.read( &content[0], filesize );
und gut
-
camper schrieb:
warum liest du nicht einfach direkt in einen vector<char> ?
weil ich die daten (später) gepackt vorliegen hab, und die mit zlib entpacken will. und die zuständige funktion gibt nen char-array zurück.
vielleicht wär's sogar besser, die daten in einem array zu lassen. aber dann kommt das ganze rumgefuchtel mit new[] und delete[]...
-
camper schrieb:
warum liest du nicht einfach direkt in einen vector<char> ?
std::vector< char > content( filesize ); i.read( &content[0], filesize );
und gut
aber das ist gut.