Datei einlesen und kopieren (pdf-Datei binär einlesen + kopieren)



  • Hallo,

    hoffe mir kann jemand helfen, da ich heute schon verzweifelt versuche, eine eigentlich triviale Funktion zu implementieren welche mir eine PDF-Datei kopiert.

    Ich scheitere aber daran, das entweder die Datei relativ gleich kopiert wird, jedoch das EOF zu früh kommt oder die komplette Datei kopiert wird, aber Zeilenumbrücke innerhalb der Binärdatei verloren gehen (Vergleiche die erstellte Datei im Wordpad)...

    Anbei mein Code:

    ...
    
    fstream fIn	(sourceFileName, ios::in|ios::binary);
    fstream fOut(destination.c_str(),ios::out|ios::binary);
    
    while( !fIn.eof() )
    {
        char ch;
        fIn>>ch;
        fOut<<ch;
    
        bytesRead++;
    
    }
    
    fIn.close();
    fOut.close();
    
    ...
    

    Möchte übrigens die Datei aufgrund eines Fortschrittbalkens nicht auf einmal einlesen...

    Hoffe mir kann jemand helfen, bin für jede Hilfe sehr dankbar.

    Wünsch euch noch einen schönen Abend.

    Gruß
    Daniel



  • Vielleicht so (habs nicht getestet):

    fOut.put (fIn.get ());
    


  • Hier hab ich als Puffer 1024 Bytes genommen. den kannst du natürlich variieren. 😉

    std::ifstream ifs("input.pdf",std::ios::binary);
    std::ofstream ofs("ouput.pdf",std::ios::binary);
    
    char buf[1024] = {0};
    std::streamsize buf_s = 1024;
    std::streamsize b_read = 0; 
    while( ( b_read = ifs.readsome(buf,buf_s)) == 1024 )
      ofs.write(buf,b_read);
    


  • Hier mal ein Beispiel um eine Datei zu kopieren.

    Das Problem ist das eof() immer dann auf true gesetzt wird wenn die
    Datei das erste '\0' erreicht.

    Und da solche Zeichen bei jedem Dateityp, ausser reinen Textdateien auch
    innendrinne also in der Datei vorkommen können, denkt er die Datei ist zu Ende.

    Nur bei einer reinen Textdatei wird das Ende mit einem '\0' markiert. Und deshalb ist die Abfrage auf eof() sinnlos, da es sehr wahrscheinlich ist das so ein '\0' auch mittendrin vorkommt 😉

    #include <iostream>
    #include <fstream>
    #include <conio.h>
    
    using namespace std;
    int main()
    {
        char buffer[256];
        char c;
        unsigned int size = 0;
        ifstream Data("meinePDF.pdf", ios::binary);
        ofstream Data_out("Kopie.pdf", ios::binary);
    
        while(size = Data.read(buffer,256).gcount())
        {
                Data_out.write(buffer,size);
        }
    
        return 0;
    }
    

    size = Data.read(buffer,256).gcount();

    Die Funktion ist das wichtigste, sie prüft ob das nächste Zeichen noch ein Teil
    der Datei ist. Ist die Datei zu Ende übergibt sie an size den Wert 0, und die Schleife wird verlassen. 😉

    Ich hoffe das hilft dir weiter. 🙂

    //EDIT ich glaub ich bin zu langsam ^^



  • wunderbar.
    Klappt jetzt alles wie gewollt. Vielen Dank für die schnellen Antworten.

    Schöne Woche noch.

    Gruß
    Daniel


Anmelden zum Antworten