Datei Kopieren über filestreams



  • Hi,

    also ich versuche gerade eine datei zu kopieren, denn später will ich dann dieses verfahren dazu nutzen eine datei zu verschiken & zu empfangen 🙂

    also ich habs ma so probiert.

    #include <iostream>
    #include <fstream>
    #include <windows.h>
    using namespace std; 
    
    int main() 
    {
      char str[500];
    
      ifstream in("alt.zip" , ifstream::binary);
      if(!in) { 
        cout << "Cannot open file.\n"; 
        return 1; 
      }
      ofstream out("neu.zip" , ifstream::binary); 
      if(!out) { 
        cout << "Cannot open file.\n"; 
        return 1;
      }
      in.seekg (0, ios::end);
      int length = in.tellg();
      in.seekg (0, ios::beg);
    
      for ( int i = 0; i < ((int)length/500); i++){
      in.read(str,500);
      out.write(str,500);
      out.seekp(i*500,ios_base::beg);
      in.seekg(i*500,ios_base::beg);
      }
      if ( (length%500) != 0 ){
      int Size = length%500;
      char * Buff = new char[Size];
      in.read(Buff,Size);
      out.write(Buff,Size);
      delete[] Buff;
      }
    
      in.close();
      return 0;
    }
    

    aber wenn ich das ganze jetzt z.B. an einer .zip datei ausprobiere meldet sich das entsprechende entpack programm das es einen fehler gab.
    Kann mir da jemand bitte helfen?


  • Administrator

    Diese beiden Zeilen sind falsch und unnötig:

    out.seekp(i*500,ios_base::beg); 
    in.seekg(i*500,ios_base::beg);
    

    Die Zeiger werden intern automatisch mitgeschoben, da musst du nichts selber schieben. Wobei du sogar hier falsch schiebst.

    Im übrigen noch ein paar Dinge:

    ((int)length/500)
    

    length ist doch schon ein int und 500 ist ein int, daher musst du nicht casten. Zudem ist das ein C-Cast, in C++ verwendet man den folgenden cast für sowas:

    static_cast<int>(...)
    

    Das ist zwar glaub ich erlaubt, trotzdem würde ich eher ofstream verwenden, statt ifstream:

    ofstream out("neu.zip" , ifstream::binary);
    

    Oder am besten gleich std::ios_base::binary

    Im übrigen würde ich persönlich auch die Schleife etwas umgestalten. Wenn du schon auf Heap-Speicher verzichten willst und nur über Stackspeicher die Sache verschieben willst, mach es doch eher so:

    char str[4096]; // Bisschen grösserer Buffer schadet nichts.
    
    in.seekg(0, ios::end);
    std::streampos length = in.tellg(); // Lieber std::streampos verwenden.
    in.seekg(0, ios::beg);
    
    std::streamsize bytesRead = 0;
    
    while(length > 0 && in.read(str, 4096))
    {
      bytesRead = in.gcount(); // Wieviel wurde gelesen?
    
      out.write(str, bytesRead);
    
      length -= bytesRead;
    }
    
    if(!in)
    {
      // Fehler ist passiert.
    }
    else
    {
      in.close();
    }
    
    // usw.
    

    C++-Referenz: http://www.cplusplus.com/reference/

    Grüssli



  • Danke für die antwort OO

    Ohne das mtischieben bringt mir dieser code...

    in.seekg (0, ios::end);
      int length = in.tellg();
      in.seekg (0, ios::beg);
    
      for ( int i = 0; i < ((int)length/500); i++){
      in.read(str,500);
      out.write(str,500);
      }
      if ( (length%500) != 0 ){
      int Size = length%500;
      char * Buff = new char[Size];
      in.read(Buff,Size);
      out.write(Buff,Size);
      delete[] Buff;
      }
    
      in.close();
      return 0;
    

    ein fehlerfreies ergebniss..

    warum deiner es nicht tut ( bei ner knapp 10mb großen datei ) versteh ich nicht.


Anmelden zum Antworten