Datein kopieren unter Linux - Segmentation fault



  • Hey,

    ich such grad verzweifelt nach einer Möglichekeit Datein mit C++ unter Linux zu kopieren. Das einzige was mir google dazu sagen konnte war: machs selber. Also hab ich mir bisl Code gesucht un den in meinem Programm umgesetzt. Folgende Methode ist dabei raus gekommen:

    /**kopiert eine Datei an einen anderen Ort
     * @source: Quelldatei
     * @dest: Zieldatei */
    void TUtils::copyFile(const char *source, const char *dest){
    	printf("copy file:\nsource:\t\t%s\ndestination:\t%s\n\n", source, dest);
    	ifstream sourceFile;
    	ofstream destFile;
    
    	sourceFile.open(source, ios::binary);
    	if (!sourceFile){
    		printf("copyFile Error: file doesn't exist: %s", source);
    		return ;
    	}	
    	destFile.open(dest, ios::trunc | ios::binary | ois::out);
    	if (!destFile){
    		printf("copyFile Error: file doesn't exist: %s", dest);
    		return;
    	}	
    
    	destFile << sourceFile;
    
    	destFile.close();
    	sourceFile.close();
    	return;
    }
    

    Leider kommt da aber ein Segmentation fault am Ende der Methode. Die Datei wird auch normal angelegt (kann aber nicht geöffnet werden). Was mach ich falsch?

    MfG Bergmann.



  • Ich mag keine C-C++-Aufläufe...



  • Ich wußte gar nicht, daß man Streams selber ausgeben kann.

    Die Lösung, die ich in Erinnerung habe, was den Stream-Buffer auszugeben: destFile<<sourceFile.rdbuf(); . (aber afaik gibt es schon genug Programme, die das direkter erledigen können :D)



  • Hm, komisch jetzt gehts auf einma, ohne das ich was geändert hab 😕
    @CStoll: ja das rdbuf muss rann, sonst is die erstellte Datei leer.
    @EOutOfResources: wie meinst du das? Ich bin neu in C/C++ un versteh immer noch nich ganz wo da der unterschied liegt. Bzw warum man das nich mixen sollte.

    MfG Bergmann.



  • Bergmann89 schrieb:

    @EOutOfResources: wie meinst du das?

    Für Zeichen ketten nutzt man std::string statt const char* . Für die Ausgabe nutzt man std::cout statt printf . Wieso? Beim std::string kann man keine Zugriffe auf Speicher, der nicht du besitzt durchführen. Und std::cout ist, im Gegensatz zu printf , typsicher.

    Und lerne etwas über das Konzept "RAII".



  • EOutOfResources schrieb:

    Für Zeichen ketten nutzt man std::string statt const char* .

    Das ist aber mal zu Unrecht verallgemeinert...



  • yahendrik schrieb:

    Das ist aber mal zu Unrecht verallgemeinert...

    Du wirst mir keine drei Beispiele nennen können, wo meine von dir zitierte Aussage nicht gültig ist...



  • Hey,

    eig benutz ich die strings. Weiß selber nich warum ich da nen Pointer übergeb. Werd das ma noch ändern.
    Aber das mit dem RAII versteh ich nich. Am Anfang der Methode werden die Variablen initialisiert und die Datein geöffnet und am Ende werden die Datei geschlossen. Und die Freigabe von angelegten Variablen übernimmt doch C++ für mich (solange es keine Sachen sind die ich mit new angelegt hab) oder bin ich da auf dem Holzweg?

    MfG Bergmann.



  • Stringliterale
    Dll-Interface
    ?

    Aber das reicht eigentlich schon. Auch in C++ hat der const char* durchaus seine Daseinsberechtigung.



  • Bergmann89 schrieb:

    Aber das mit dem RAII versteh ich nich.

    Die beiden close -Aufrufe werden vom DTor gemacht 😉 .



  • yahendrik schrieb:

    Stringliterale

    Was ist damit? Die werden implizit kovertiert.



  • yahendrik schrieb:

    Stringliterale
    Dll-Interface
    ?

    Performance

    😉



  • Shade Of Mine schrieb:

    Performance
    😉

    lol, ich wusste, irgendwas hatte ich vergessen 👍
    Argh, Komma.



  • Erstelle die Streams auch alle erst so spät wie möglich und nicht alle am Anfang. Auch kann man Streams direkt im Konstruktor öffnen, womit man sich den open() Aufruf spart.



  • offline schrieb:

    Erstelle die Streams auch alle erst so spät wie möglich und nicht alle am Anfang. Auch kann man Streams direkt im Konstruktor öffnen, womit man sich den open() Aufruf spart.

    Dann kannst du aber auch gleich dazu erwähnen, dass Streams RAII können. Immer diese halben Wahrheiten 🙄



  • 314159265358979 schrieb:

    erwähnen, dass Streams RAII können.

    Das habe ich schon gemacht. Er wollte mich wahrscheinlich einfach nicht wiederholen.


Anmelden zum Antworten