binär in datei schreiben

zapp91

Grünschnabel
Hi,
ich wollte einen String binär an eine exe hängen das mache ich so.

Code:
 fstream f;
    f.open("test.exe", ios::out|ios::ate|ios::binary);
    f << "Dieser Text geht in die Datei" << endl;
    f.close();

aber meine exe wird immer komplett überschrieben, obwohl ich den String ja hinten ans Ende der Datei schreiben wollte. Ich hoffe ihr könnt mir helfen.

Danke

Zapp91
 
Hi.

Dein open Modus ist äquivalent zum fopen Modus "wb" - und das bedeutet nun mal: kürze Datei auf 0 Byte und öffne zum Schreiben.

Versuch's mal mit ios::out | ios::app | ios::binary. (ist äquivalent zu fopen "ab")

Gruß
 
Hallo,

oder aber auch ios::in | ios::out | ios::ate | ios::binary (dann kann man auch den bereits vorhandenen Dateiinhalt überschreiben, wenn dies gewünscht ist).

Grüße,
Matthias
 
Vielen Vielen Dank ihr beiden, klappt super. Jetzt hätte ich dann grade noch ne Frage, wie würdet ihr diesen String wieder auslesen, dass ich eben nur das habe was ich reingeschrieben habe.

Danke

Zapp91
 
Hallo,

Also ich mach das bei meinen dateien so, das ich, bevor ich meine "nutzdaten" an die EXE dran hänge noch einen Seperator wie "THISISTHEENDOFTHEEXEFILE" einfüge.

D.h. so

(exe-datei-daten)THISISTHEENDOFTHEEXEFILE(weitere-binär-daten)

.. danach einfach nach "THISISTHEENDOFTHEEXEFILE" suchen, und ab dann die Daten auslesen.

Tipp von mir: Lies beim Suchen nach dem String die Datei von HINTEN nach vorne aus da sich in der Exe der String auch nochmal befinden kann.
 
Ja sowas hab ich mir auch gedacht, oder dass ich hingehe und eine spezielle Größe für meinen zu schreibenen String festlege und dann diese größe von Ende der Datei nach vorne gehe. Mein Problem ist eher wie ich das auslesen kann, wäre nett wenn du mir das mal kurz mit deiner Methode erklären könntest.

Danke

Zapp91
 
Hallo!

Ich zeig dir am besten meinen Code ... ist nur ein Problem dabei, funktioniert nur wenn der Seperator genau 12-Zeichen lang ist :-D Ich weiß .. schlampig programmiert .. sorry :P
Aber es sollte kein Problem sein das anzupassen ;)

Code:
char* GetAppendix(const char* filename, long &appendixsize, const char* sseperator="ENDOFPROGRAM");
long GetFileSize(const char* filename);

char* GetAppendix(const char* filename, long &appendixsize, const char* sseperator)
{
	FILE *fp;
	char chkbuf[12];
	char *retbuf;
	int filesize, appendixoffset, retbytes;

	bool found=false;
	long offset=0;

	filesize = GetFileSize(filename);


	fp = fopen(filename,"rb");

	// suche nach sseperator
	while(!found && ((filesize-offset-12) > 0))
	{
		fseek(fp,filesize-offset-12,SEEK_SET);
		fread((char*)chkbuf,sizeof(char),sizeof(chkbuf),fp);

		if(memcmp(chkbuf,sseperator,12) == 0)
		{
			// gefunden!
			appendixoffset = (filesize-offset);
			found = true;
		}
		else
		{
	      offset++;
		}
	}

	// Nicht gefunden
	if(!found)
	{
		appendixsize = 0;
		return NULL;
	}

 	appendixsize = filesize-appendixoffset;

	retbuf = (char*)malloc(appendixsize);

	fseek(fp,filesize-appendixsize,SEEK_SET);
	retbytes = fread(retbuf,1,appendixsize,fp);

	fclose(fp);

	return retbuf;
}

long GetFileSize(const char* filename)
{
	FILE *fp;
	long filesize;

	fp = fopen(filename,"r");
	fseek(fp,0,SEEK_END);
	filesize = ftell(fp);
	fclose(fp);

	return filesize;
}

--edit:
Um dann deinen Code aus der Exe zu bekommen, kannst du das wie folgt aus der main() funktion machen

Code:
int main(int argc, char** argv)
{
  char* cpMeineNutzdaten;
  long lMeineNutzdatenlaenge;

  cpMeineNutzdaten = GetAppendix(argv[0], lMeineNutzdatenlaenge, "ENDOFPROGRAM"); // Letzter Parameter MUSS 12-Zeichen haben

  // cpMeineNutzdaten ist nun ein Pointer der auf meine Nutzdaten zeigt ...
  // insert more brainwork here ...
}
 
Zuletzt bearbeitet:
Danke, damit hast du mir schon sehr geholfen, aber ich glaube es geht einfacher über die von mir beschrieben varinate, hier hab ich da was in VB


Open file For Binary As #1
Get #1, (LOF(1) - 99), options

hat da vlt einer ne idee, das einfach in c++ zu übersetzen
 
Du könntest das ganze auch mit seekg() und tellg() machen:

Code:
fstream f;
unsigned long p=0;

//Datei zum schrieben öffnen...

f.seekg(0L,ios::end); //Ans Ende gehen
p=f.tellg(); //Stelle merken
f.seekg(0L,ios::beg); //Zum Anfang

//Daten reinschreiben

f.seekg(p,ios::beg); //Vom Beginn zur gemerkten Stelle springen

//Daten auslesen -> müsste reingeschriebener String sein

So, bin mir nicht ganz sicher ob das so klappt, einfach mal ausprobieren.

Gruß
cesupa
 
Zurück