[Anfänger] Datei kopieren
-
Hi,
Ich fange gerade mit C++ an und wollte zu Übungszwecken ein Programm schreiben was mir einfach eine Datei kopiert und da hab ich so ein paar Probleme mit.
#include <iostream> #include <string> #include <stdio.h> #include <stdlib.h> #include <math.h> using namespace std; int main() { string string_source; string string_target; char * buffer; long filesize; FILE * source; FILE * target; cout << "Source file: "; cin >> string_source; source = fopen("source.exe", "rb"); while(source == NULL) { cout << "File " << string_source.c_str() << " does not exist!\n"; string_source = ""; cout << "Source file: "; cin >> string_source; source = fopen(string_source.c_str(), "rb"); } // end while // obtain file size: fseek(source, 0, SEEK_END); filesize = ftell(source); rewind(source); // allocate memory to contain the whole file: buffer = (char*) malloc (sizeof(char)*32); if(buffer == NULL) { cout << "Memory error!"; exit(1); } // end if cout << "Target file: "; cin >> string_target; target = fopen("target.exe", "wb"); while(target == NULL) { cout << "File " << string_target << " can't be created!\n"; string_target = ""; cout << "Target file: "; cin >> string_target; target = fopen(string_source.c_str(), "wb"); } // end while cout << "\nCopy data in progress"; double while_count; while_count = ceil(filesize / 32); while_count = (int)while_count; for(int i=0; i <= while_count; ++i) { if(!(i%10000)) { cout << "."; } fread(buffer, 32, 1, source); fputs(buffer, target); } // end while fclose(source); fclose(target); } // end main
Was jetzt nicht funktioniert:
1. wenn ich einen Dateinamen eingebe und diesen dann als Parameter benutze wird die Datei wohl geöffnet aber der Inhalt wird gelöscht (source). Deswegen habe ich erstmal einen String als Parameter benutzt. Damit geht es zwar aber so ist die Anwendung ja nicht mehr dynamisch.
2. Beim kopieren gibt es Probleme: offensichtlich werden alle NULL-Zeichen nicht mit kopiert (was die .exe natürlich unbrauchbar macht).
-
fputs ist auch so dokumentiert, dass eben das terminierende NULL-Zeichen nicht mitkopiert wird (damit schreibt man Strings):
http://msdn.microsoft.com/de-de/library/t33ya8ky(VS.80).aspx
Nimm als Gegenstück zu fread einfach fwrite.
-
nun gehts
aber damit ist nur problem 2. gelöst. was ist mit problem 1.? string_source.c_str() scheint zwar zu funktionieren aber die dateigröße von der quelle wird dann immer auf 0 byte gesetzt?!
edit: hab das problem selber gefunden
target = fopen(string_source.c_str(), "wb");
das kann ja nich gehen
-
BlakkCooper schrieb:
Hi,
Ich fange gerade mit C++ an
und wieso postest du dann im ANSI C Forum?
Es ist keine gute Idee C und C++ zu mischen, wenn du schon C++ verwendest, dann verwende auch std::ofstream statt fopen.