std::string nicht bei \0 stoppen lassen...
-
Hi Leute,
ich habe eine Binärdatei, die ich einen char* lege.
Lege ich sie von diesem aber in einen std::string stoppt dieser beim 32. Zeichen.
Ich bin mir ziemlich sicher, dass da \0 herrscht.
Aber ich kenne die genaue Größe und möchte auch gerne genau soviel in den std::string reinlegen und dann damit arbeiten.
Wie kann ich das realisieren?
Der \0 ist Pflicht, wie gesagt es ist eine Binärdatei, da muss alles vorkommen (können).MfG MAV
-
std::vector<char>
oder eigene char_traits schreiben...
-
da es sich ja hier nicht wirklich um einen string handelt, lieber den vector.
-
Original erstellt von Mis2com:
ich habe eine Binärdatei, die ich einen char lege.*Hier liegt das Problem. 'std::string' kann selbstverständlich Nullbytes enthalten, aber er liest den 'char*' nur bis zum Endmarker, '\0', aus, denn er hat keine Informationen darüber, wie land der 'char*' wirklich ist. Darum kopiert man idR zeichen- oder blockweise in den 'std::string' hinein.
-
Hallo,
ein std::string kann auch gerne das Nullzeichen enthalten:
Du kannst also ohne weiteres folgendes machen:#include <fstream> #include <string> #include <iterator> using namespace std; int main() { ifstream file("test.exe", ios::in|ios::binary); if (file) { streampos p1 = file.tellg(); file.seekg(0, ios::end); string content; content.reserve(file.tellg()); file.seekg(p1, ios::beg); content.assign(istreambuf_iterator<char>(file), istreambuf_iterator<char>()); } }
Dumm ist nur, dass nicht alle std::string-Implementationen ein Membertemplate assign besitzen.
Hier müsste man dann std::copy + einen inserter verwenden (die Dinkumware-Lib des VC 6. stellt auch kein std::string::push_back zur Verfügung. Man kann also kein back_inserter einsetzen)#include <fstream> #include <string> #include <iterator> #include <iostream> using namespace std; int main() { ifstream file("test.exe", ios::in|ios::binary); if (file) { streampos p1 = file.tellg(); file.seekg(0, ios::end); string content; content.reserve(file.tellg()); file.seekg(p1, ios::beg); copy(istreambuf_iterator<char>(file), istreambuf_iterator<char>(), inserter(content, content.begin())); } }
Alternativ würde ich ein vector<char> + istream::read vorschlagen.
-
Ich nehme an der Stelle jetzt einfach char*, mir ist das zu kompliziert, außerdem muss ich hier sowieso jedes byte einzeln lesen und brauche doch nur ganz kurz string...
Ja, geht mit string auch, aber char* reicht da völlig, ich habe aber ein neues kleines Problemchen.
Wie kann ich auf einfachste Weise aus 2 Bytes ein unsigned short machen?Die Bytes sind natürlich char hier, aber zwei char die im Array auch hintereinander liegen krieg ich einfach nicht zu einem unsigned short zusammengemeißelt.
Weiß jemand Rat?
Ist ja nur eine Codezeile maximal...PS: Und wie bekomme ich ein einzelnes char als zahl angezeigt? also a soll zum Beispiel zu 64 werden, oder was der ASCII Code dafür ist, auch ganz simpel, bin aber etwas perplex momentan.
Ich mach doch ein neues Thema auf...
MfG MAV
[ Dieser Beitrag wurde am 09.06.2003 um 12:32 Uhr von Mis2com editiert. ]