vector<char> als Puffer für C-API
-
std::string ist nicht wirklich gut geeignet für binäre Daten. Binäre Daten unterscheiden sich in dem Zusammenhang von "Text-Daten" nur dadurch, dass sie das Null-Zeichen enthalten können.
Nimm lieber vector<char>, da ist die Länge unabhängig von eventuellen Nullzeichen.
edit: Originalthread
-
lol wasn vector<char>? noch nie gesehen...
-
burnner schrieb:
lol wasn vector<char>? noch nie gesehen...
Kennst du nicht std::vector?
Und da vector ein template ist, gibt es eben auch vector<char>.Nebenbei ist std::vector<char> kompatibel zu C-Strings, wie sie eine C-API verwendet.
-
hmm was braucht man da für includes?
-
#include <vector>
Wer hätte das gedacht?
p.s.: Und evtl. ein C++-Tutorial deiner Wahl.
vector ist eine Klasse der STL und wird deswegen von jedem C++-Compiler angeboten.
-
lol den Vektor abschnitt hab ich in meinem C++ nicht gelesen
-
und wie kopier ich nun ein stück der Datei in diesen Vekotor und sende ihn dann?
-
Mit vector::resize() kannst du ihn erstmal auf eine bestimmte Größe bringen. Dann die Datei reinkopieren (da gibts viele Möglichkeiten).
Senden geht dann so:
send(sockket, &v[0], v.size());
Mit v[0] greifst du auf das erste Element zu, mit & holst du die Adresse; du bekommst also einen char* (einen Zeiger auf das erste Element).
-
arg
ich schaffs nicht mit dem reinkopieren
-
edit: nicht genau gelesen.
mfg
-
weiss keiner was
?
-
und wie kopier ich nun ein stück der Datei in diesen Vekotor
ich schaffs nicht mit dem reinkopieren
vector<char> foo; ifstream datei("foo.txt"); copy (istream_iterator<char>(datei), istream_iterator<char>(), back_inserter(foo));
Datei in den Vector kopiert.
-
und nur 1 byte? weil ich kann ja nicht 100mb da rienladen
-
burnner schrieb:
und nur 1 byte? weil ich kann ja nicht 100mb da rienladen
doch. solange der speicher reicht.
-
Du kannst in C++ mit allen Streams gleich umgehen. Alles, was mit cout geht, geht auch mit selbstangelegten ofstreams, alles, was mit cin geht geht auch mit selbst angelegten ifstreams.
und nur 1 byte?
char byte; datei >> byte;
-
lol es sollte binär sein.. und wer das post vorher gelesen hat (das in WinApi) sollte sehen was mein Problem ist.. ich will Dateien übertragen.. also sollt der Vekot dann so aussehen:
File:1byt der daei |mfg burnner
-
ifstreams könenn auch binär arbeiten. einfach ios::binary beim öffnen angeben. Und wann hast du mir gesagt, dass ich zum beantworten der Frage einen Thread aus dem Winapi-Forum lesen muss?
-
Das ist einfach nur ne Änderung im Konstruktor von fstream. Mit dem Vektor hat das nix zu tun.
-
ich weiss wie man binär schreibt und liest...
http://www.c-plusplus.net/forum/viewtopic.php?t=96230
das ist das eigentliche Problem.. darum auch die Vektoren..
-
btw: Du markierst das Ende der binären Daten mit einem '|'. In binären Daten kann aber jedes mögliche Zeichen vorkommen, also auch ein '|'.
Du hast zwei Möglichkeiten: Entweder du maskierst jedes '|'-Zeichen in den Daten (z.B. indem du zwei '|' draus machst) oder du übermittelst vorher die Länge der Daten.
Letzteres wäre wahrscheinlich einfacher (TCP garantiert ja, dass keine Daten verloren gehen).