Datei aus größerer Datei auslesen



  • Was ich tun will, ist anhand einer vorgegebenen Position und Länge aus einer großen Datei eine Reihe von Daten in eine kleinere Teildatei auszugliedern.

    Derzeit sieht das so aus:

    void UTF::SaveContent(int pos, int size, char *output_name) {
    	// open output stream
    	ofstream output(output_name, ios::out | ios::binary);
    
    	// go to start of node's content
    	stream->seekg(pos, ios::beg);
    	int pos = stream->tellg();
    
    	// allocate and fill buffer
    	char *buffer = new char[size];
    	stream->get(buffer, size);
    	// write buffer to output stream
    	output.write(buffer, size);
    	// delete the buffer
    	delete[] buffer;
    
    	output.close();
    }
    

    Das scheint aber nicht zu gehen. Öffne ich die neue Datei im Hex-Editor, hat sie zwar genau die richtige Länge und auch die ersten Daten werden richtig übernommen, aber ab dem 12. Byte ist alles nur noch mit immer demselben Byte besetzt. Wo ist denn da der Fehler?

    Übrigens: geht es auch effizienter, als dass ich erst den gesamten Inhalt in einem Buffer zwischenspeichern muss? Das verdoppelt ja die benötigte Zeit.



  • void save_content(const std::string& file_in , const std::string& file_out, const std::streampos& pos, const std::size_t& size) 
    {
        std::ifstream stream_in(file_in.c_str(), std::ios::in | std::ios::binary);
        std::ofstream stream_out(file_out.c_str(), std::ios::out | std::ios::binary);
    
        if (!stream_in || !stream_out)
            throw "Could not open!";
    
        stream_in.seekg(0, std::ios::beg);
        stream_in.seekg(0, std::ios::end);
        if ((pos + size) > stream_in.tellg())
            throw "Not part of file!";
    
        stream_in.seekg(pos, std::ios::beg);
        char* data = new char [size + 1];
        stream_in.read(data, size);
        stream_in.close();
        stream_in[size] = 0;
        stream_out.write(data, size);
        stream_out.close();
        delete [] data;
    }
    

    ... was gehtn daran net? 🙂



  • Ich hatte stream->get() und stream->read() vertauscht. Ich weiß zwar nicht genau warum, aber da hat er dann wohl nur 11 Zeichen gelesen und der Rest des Buffers war dann halt einfach nicht gesetzt, also konnte auch beim Schreiben nur Mist rauskommen. Jetzt geht's.


Anmelden zum Antworten