[fstream]fehler beim speichern von binärdaten in cstring



  • tag an alle,

    hab eine funktion geschrieben die Files binär einliest und diese in einem char array speichert, das später die daten über einen socket verschicken soll

    char* read_file(char* _path_of_file)
    {
    	//declare...
    	ifstream in;
    
    	char* file;
    
    	//open streams (binary)
     	in.open(_path_of_file, ios_base::in | ios_base::binary );
     	if ( !in )
     	{
     		cerr << "ERROR ==> file dosent exist !!!" << endl;
     		exit (1);
     	}
    
    	//get size of file, witch will be send
    	in.seekg(0, ios_base::beg);
    	in.seekg(0, ios_base::end); 		
    	const unsigned long file_size = in.tellg();
    	in.seekg(0, ios_base::beg);	
    
    	//allocate memory(HEAP) we need
    	file = new char[file_size];
    
    	in.read(file, file_size);
    
    	//kill stream
    	in.close();
    
    	return file;
    }
    

    Wenn ich dieser Funktion eine textdatei übergebe, funktioniert alles wunderbar.
    Wenn ich aber eine andere datei(bspw mp3) übergebe dann ist die länge des char arrays nur 7 byte gross und die datei dann logischerweise nicht ausführbar.
    der inhalt der arrays :

    "\177ELF\001\001\001"
    

    jmd nen plan woran das liegen könnte ?

    Danke schonmal
    darrel



  • Hallo,
    Bemerkst Du das beim debuggen, wenn file_size nur den wert 7 besitzt, obwohl du eine längere datei eingelesen hast?

    Simon



  • Ganz unabhängig davon.
    Die grösse des erzeugten char arrays (file) musst du auch irgendwie bekannt machen.
    Ich meinen nach dem aufruf von read_file hast du einen char* aber du weisst die länge nicht.

    Du könntest auch eine std::vector<char> benutzen. Dann ist die Länge schon mit drin.

    Gruss Simon



  • simon.gysi schrieb:

    Hallo,
    Bemerkst Du das beim debuggen, wenn file_size nur den wert 7 besitzt, obwohl du eine längere datei eingelesen hast?

    Simon

    ja, beim debuggen lese ich auch den inhalt des char arrays aus!

    EDIT:
    bzw nein! wenn ich den ihalt der variable file_size über den debugger abfrage er halte ich auch die richtige dateigrösse.
    Erst wenn ich die grösse des rückgabewerts der funktion prüfe, erhalte ich die falsche dateigrösse



  • simon.gysi schrieb:

    Ganz unabhängig davon.
    Die grösse des erzeugten char arrays (file) musst du auch irgendwie bekannt machen.
    Ich meinen nach dem aufruf von read_file hast du einen char* aber du weisst die länge nicht.

    Du könntest auch eine std::vector<char> benutzen. Dann ist die Länge schon mit drin.

    Gruss Simon

    Ist erstmal unwichtig, da es bei einer txt datei funktioniert ( auch das verschicken über den socket)



  • Auch wenn du das char array über ein socket verschickst, musst du die länge angeben.

    Wie sendest Du?
    Wie findest Du ausserhalb der read_file Funktion die Länge heraus?
    (strlen???)



  • simon.gysi schrieb:

    Auch wenn du das char array über ein socket verschickst, musst du die länge angeben.

    Wie sendest Du?
    Wie findest Du ausserhalb der read_file Funktion die Länge heraus?
    (strlen???)

    jop!

    ...aber darum geht es ja nicht, weil die rückgabe von read_file ja nicht correkt ist
    (ausser bei txt files )



  • ich denke die rückgabe von read_file ist schon korrekt.
    nun, strlen ist dafür gedacht die länge eines null terminierten strings zu ermitteln. d.h. diese funktion prüft nur bis zum ersten 0.
    strlen ist nicht für binäre daten gemacht.

    Du musst die in read_file ermittelte länge auch "veröffentlichen".

    Edit: Und es ist klar dass es bei Textfiles klappt, denn die speichern ja genau einen solchen (null terminierten) string.

    Edit2: Überprüfe doch ob bei der Stelle 7 im File eine 0 steht. z.B. mit einem Hex Editor.



  • simon.gysi schrieb:

    ich denke die rückgabe von read_file ist schon korrekt.
    nun, strlen ist dafür gedacht die länge eines null terminierten strings zu ermitteln. d.h. diese funktion prüft nur bis zum ersten 0.
    strlen ist nicht für binäre daten gemacht.

    Du musst die in read_file ermittelte länge auch "veröffentlichen".

    Edit: Und es ist klar dass es bei Textfiles klappt, denn die speichern ja genau einen solchen (null terminierten) string.

    Edit2: Überprüfe doch ob bei der Stelle 7 im File eine 0 steht. z.B. mit einem Hex Editor.

    ja thx für die hilfe!
    du hast natürlich recht, da hätte ich auch selbst drauf kommen können

    vielen dank nochmal
    gruss darrel



  • Sicher das du überhaupt (also kommt jetzt auf die Dateigröße an!) die Datei schicken kannst? In einem?

    void read_file(std::string const& file_name, std::string& dest)
    {
        std::ifstream file_stream(file_name.c_str(), std::ios_base::binary);
        if (!file_stream) throw std::invalid_argument("invalid filename");
        dest = std::string(std::istream_iterator<char>(file_stream), std::istream_iterator<char>());
    }
    

    ließt dir auch den Inhalt der Datei ein 😉


Anmelden zum Antworten