Fireplace

C++ Datei mit '\0'-Werten komplett einlesen

Crazy Driver

Ensign
Registriert
Jan. 2011
Beiträge
182
Hallo,

Ich würde gerne wissen, wie man Dateien mit '\0'-Werten vollständig einliest.
Es ist ja so, dass ein String sobald ein '\0' kommt abgeschlossen wird, aber ich würde gerne Dateien,
die '\0' enthalten (z.B. .exe) gerne bis zum Ende einlesen lassen.
Gibt es da irgendeine Möglichkeit?
 
std::string ist für binärdaten nicht geeignet. davon solltest du grundsätzlich abstand nehmen.
am besten einfach nen ausreichend großen puffer reservieren und dann mit fread einlesen.
 
Weil std::string für Zeichenketten (=Text) gedacht ist, und nicht für Binärdaten.
 
Und wie speicherst du dann Binärdaten EINFACH ab, char[] mit size_t size oder wie.
Und wie findest du dadrin irgendwelche Sachen.

Beispiele:
Ausschnitt: substr <-> new+memcpy?
Suche: find_first_of <-> ?
Kopieren: operator= <-> new+memcpy
Aufräumen: <-> delete[]
Als stream verarbeiten: stringstream::str(s) <-> ?

Von dem her finde ich das Argument "ist dafür nicht gedacht" schon etwas ... mager.
 
Man könnte sie z.B. in einem std::vector speichern. So ungern ich das auch tue, aber ich muß IceMatrix leider beipflichten; std::string ist für Binärdaten nicht unbedingt die optimale Lösung.


P.S. Beispiel (hab's nicht kompiliert ... hoffe, es sind keine Fehler drin ;)) ...

Code:
#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>


int main()
{
	// einlesen
	std::ifstream ifs( "binaryFile.bin", std::ios::in || std::ios::binary );
	
	if ( ! ifs )
	{
		std::cerr << "Failed to read file!\n";
                return 1;
	}
	
	// vom stream in einen vector
	std::vector< unsigned char > binContent( ( std::istreambuf_iterator< char >( ifs ) ), std::istreambuf_iterator< Utils::CharacterType >() );
	
	// ...

}
 
Zuletzt bearbeitet:
Dein Beispiel verwendet Utils::CharacterType, mit char (+return 0) läufts.
Klar, mit vector geht sehr viel, aber jetzt brauchst du zur Suche std::algorithm oder aber ne eigene Schleife.
BTW: Man kann auch ein string auf diese Weiße füllen und die Variante mit den iteratoren ist eine ziemlich elegante Lösung für die Frage des TE.

Klar, string ist nicht DIE Lösung, aber für schnelle Sachen geht es gut. Für komplexe Sachen ist aber dann ein direkter Streamparser wahrscheinlich die beste Wahl.
 
Blitzmerker schrieb:
Dein Beispiel verwendet Utils::CharacterType, mit char (+return 0) läufts.


Bäh, ja ... habe den Code schnell aus Auszügen eines meiner Projekte zusammengeschustert und dabei vergessen, alle Referenzen auf Utils::CharacterType zu entfernen. :p Das return 0; am Ende sollte aber optional sein.
 
Blitzmerker schrieb:
Klar, string ist nicht DIE Lösung, aber für schnelle Sachen geht es gut. Für komplexe Sachen ist aber dann ein direkter Streamparser wahrscheinlich die beste Wahl.

Die anderen Methoden sind nicht aufwändiger als std::string. Das was du hier machst ist keine schnelle Lösung, sondern gepfusche. Spätestens wenn jemand anders den Code bearbeiten soll und es nicht weiss dass du Binärdaten in dem string gespeichert hast wird es Probleme geben.

Mach es gleich richtig, das erspart später viel Ärger.
 
Zuletzt bearbeitet:
Zurück
Oben