\0 in string

Skini

Erfahrenes Mitglied
Hi Leute,
ich stehe gerade vor dem Problem, dass ich einen binär Datei in einen String auslesen muss. Da die Datei bereits an der vierten Stelle ein \0 enthält ist der String auch eben nur drei Stellen lang.
C++:
char getBinaryFile(string pathToFile){
	long len;
	char *content;
	FILE *binary_file = fopen(("CDir" + pathToFile).c_str(),"rb");
	if(!binary_file){return 0;}
	fseek(binary_file,0,SEEK_END); //go to end
	len=ftell(binary_file); //get position at end (length)
	fseek(binary_file,0,SEEK_SET); //go to beg.
	content=(char *)malloc(len+1); //malloc buffer
	fread(content,len,1,binary_file); //read into buffer
	fclose(binary_file);
	return (char)content;
}
Ich benötige den Rückgabewert als String weil ich die Rückgabe später so verarbeite:
C++:
//...
binary_file_content = getBinaryFile(path);
//..
string r_buffer = header_part1 + binary_file_content + header_part2;
return r_buffer;
Weiss jemand einen Ausweg?
Ich möchte dann doch nicht dass ganze Programm mschreiben, wil alles auf diesem Rückgabe String aufbaut :)
Greetz Skini
 
Moin,

ich habe zwar das Problem nicht ganz verstanden (lokalisieren) können, aber einige Anmerkungen:

Dein Rückgabetyp "char" ist kein String, sondern nur EIN Zeichen (es sollte dann zumindest "char*" heißen, oder ? ?)

Wenn Du schon von "String" schreibst, warum nutzt Du dann nicht auch den Datentyp 'string' ? ?

Programmierst Du in C oder C++?

Gruß
Klaus
 
Hi.

Erstens gibst du keinen String zurück, sondern nur ein einzelnes Zeichen.

Wenn du irgendwas castest, sollte es natürlich auch stimmen und du solltest natürlich auch genau wissen was du tust. In allen anderen Fällen, wenn du nur castest um den Compilerfehler wegzubekommen, wird es sicherlich falsch.

Dann fehlt dir ein Rückgabewert bei deiner Funktion. Denn du mußt auch wissen wie groß der Puffer ist den du da zurückgibst (wenn du es nicht anders berechnen kannst).

Du kannst einen Puffer (mit beliebigen Zeichen) in eine String mit assign einlesen oder du nutzt den entsprechenden Konstruktor:
C++:
char* buf,
std::size_t buf_size;

...

std::string s1(buf, buf_size);

// oder:

std::string s2;
s2.assign(buf, buf_size);
Gruß
 
Ist ja gar nicht nullterminiert :-(
Hab's jetzt so geändert:
C++:
string getBinaryFile(string pathToFile){
	int len;
	char *content;
	string return_buf;
	FILE *binary_file = fopen(("www" + pathToFile).c_str(),"rb");
	if(!binary_file){return 0;}
	fseek(binary_file,0,SEEK_END); //go to end
	len=ftell(binary_file); //get position at end (length)
	fseek(binary_file,0,SEEK_SET); //go to beg.
	content=(char *)malloc(len+1); //malloc buffer
	fread(content,len,1,binary_file); //read into buffer
	fclose(binary_file);
	return_buf.assign(content, len);
	return return_buf;
}
 
Ahh, Erleuchtung !:)
so ist es natürlich gleich viel kompakter und kürzer!
Vielen Dank,
Skini

EDIT:
Was hab ich denn jetzt wieder falsch gemacht?
C++:
string getBinaryFile(string pathToFile){
	std::ifstream binary_file(pathToFile, ios::in | ios::binary);
	std::ostringstream return_buf(ios::out | ios::binary);
	return_buf << binary_file.rdbuf();
	return return_buf.str();
}

Code:
Error E2450 2: Undefined structure 'ifstream' in function getBinaryFile(string)
Error E2034 2: Cannot convert 'string' to 'ifstream' in function getBinaryFile(string)
Error E2293 2: ) expected in function getBinaryFile(string)
Error E2450 3: Undefined structure 'ostringstream' in function getBinaryFile(string)
Error E2034 3: Cannot convert 'int' to 'ostringstream' in function getBinaryFile(string)
Error E2315 4: 'rdbuf' is not a member of 'ifstream', because the type is not yet defined in function getBinaryFile(string)
Error E2315 5: 'str' is not a member of 'ostringstream', because the type is not yet defined in function getBinaryFile(string)

EDIT:EDIT:
Wie peinlich: header vergessen :p
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück