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?
-
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::binaryIm ü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.