Datei lässt sich nicht kopieren oder nur teilweise



  • Hey,
    hab mal wieder ein klaines Problemchen.
    Will mit einem Buttonklick eine Datei kopieren. Habe bis jetzt folgendes probiert:
    Folgende Kopierfunktion geschrieben:

    #include <fstream>
    #include <iostream>
    using namespace std;
    
    void __fastcall TForm1::FileCopy(AnsiString Src,AnsiString Dest)
    { //
      char ch;
    
      ifstream *from= new ifstream(Src.c_str());
      ofstream *to= 	new ofstream(Dest.c_str());
      //
      while(from->get(ch)) to->put(ch);
    	//
      from->close();
      to->close();
      //
      delete from;
      delete to;
    }
    

    Problem: von 2 MB werden gerade mal 24 KB kopiert.

    FAQ gelesen. Zweiter Versuch

    AnsiString komplett, Pfad, name;
      Pfad="d:\\Pictures-JPEG\\";
      name=ini->ReadString("file","position","failed");
    
      komplett=Pfad+"\\"+name;
    
      ifstream FileInCopy(komplett,ios::binary );
      ofstream FileOutCopy("d:\\all2.zip", ios::binary);
    
      if (FileInCopy)
        FileOutCopy << FileInCopy.rdbuf();
    

    Fehlermeldung:
    [C++ Error] Unit1.cpp(191): E2285 Could not find a match for 'ifstream::basic_ifstream(AnsiString,enum)'

    Kann mir jemand sagen worans liegt ??

    FGGF



  • The Godfather schrieb:

    ifstream FileInCopy(komplett,ios::binary );
    

    Fehlermeldung:
    [C++ Error] Unit1.cpp(191): E2285 Could not find a match for 'ifstream::basic_ifstream(AnsiString,enum)'

    Kann mir jemand sagen worans liegt ??

    FGGF

    In dinem ersten Code hast du noch ein char* übergeben, jetzt einen AnsiString. Da ifstream aber keinen AnsiString kennt, kanns also nit funktionieren. Daher von AnsiString nach char umwandeln. Wie weißt du ja bereits, deinem ersten code nach zu urteilen 😉



  • Die zweite Möglichkeit ist vollkommen unabhängig von der ersten.
    Es sind 2 verschiedene Lösungsansätze zum Dateien kopieren.
    Ich übergebe der 1. Funktion 2 AnsiStrings Source und Destination.
    Allerdings wird nur ein Teil der Datei kopiert und nicht alles.
    10-30 KB von2 MB.

    FileInCopy ist eine komplett andere Funktion, ich rufe mit der zweiten Möglichkeit nicht die erste auf. Sonst würde der AUfrunf heissen
    FileCopy(AS,AS)
    FileInCopy ist eine definierte Funktion (fstream).
    Hier wird bei In ein AS übergeben, as ich ja auch versuche. Allerdings kommz dann oben genannte Fehlermeldung.
    Gebe ich die Source "d:\\all.zip" und die Destination "d:\\copyall,zip" funktioniert es ja auch ohne Probleme. Nur wenn ich den AS mit o.g. Code übergeben will bringt er diese Fehlermeldung.

    MFGGF

    @Püppchen Im *char soll nur der Inhalt zwischengespeichert werde.



  • hmmm,mach doch
    ifstream in(datei);
    ofstream out(anderedatei);
    AnsiString temp;
    while(!in.eof())
    {
    temp+=in.get();
    };
    out<<temp;



  • Habs mit deinem auch probiert.

    AnsiString komplett, Pfad, name,temp, komplett2;
    
      Pfad="d:\\Pictures-JPEG\\";
      counter=ini->ReadInteger("counter","now",0);
      name=ini->ReadString("jpeg",IntToStr(counter),"failed");
      acht=ini->ReadString("Directory","4","failed");
    
      komplett=Pfad+"\\"+name;
      komplett2=acht+"\\"+name;
    
      ifstream in(komplett);
      ofstream out(komplett2);
    
      while(!in.eof())
      {
        temp+=in.get();
      };
      out<<temp;
    

    ==>[C++ Error] Unit1.cpp(190): E2285 Could not find a match for 'ifstream::basic_ifstream(AnsiString)'

    Irgendwie mag der nie nen AnsiString im Aufruf.
    Was amch ich denn falsch. Hab ich irgendwie irgendwo was vergessen, oder bin ich heute einfach zu blöd dazu ?!? 😡

    FGGF



  • The Godfather schrieb:

    FileInCopy ist eine definierte Funktion (fstream).

    Falsch. FileInCopy stellt eine Instanz der Klasse ifstream dar.

    The Godfather schrieb:

    @Püppchen Im *char soll nur der Inhalt zwischengespeichert werde.

    Wer lesen kann ist klar im Vorteil 😉 Ich habe das char* nicht auf deinen Buffer bezogen, sondern auf den Übergabe Parameter, den ifstream erwartet.

    The Godfather schrieb:

    AnsiString komplett, Pfad, name,temp, komplett2;
    
      ifstream in(komplett);
      ofstream out(komplett2);
    

    ==>[C++ Error] Unit1.cpp(190): E2285 Could not find a match for 'ifstream::basic_ifstream(AnsiString)'

    Also nochmal, ifstream erwartet einen char* kein AnsiString, ergo musst du deinen AnsiString in char* umwandeln.

    ifstream in(komplett.c_str());   //selbiges auch bei ofstream
    

    und schon hast du char* was ifstream (lt. meiner hilfe) auch erwartet

    basic_ifstream(const char* s,
                   ios_base::openmode mode= ios_base::in,
                   long protection= 0666);
    

    🕶 🤡



  • Sorry,
    stand wohl etwas auf dem Schlauch. Tut mir leid.
    Hast ja Recht. War etwas durch den Wind.
    Auf jeden Fall hats jetzt funktioniert. Man du immer diese
    Newbies(<====)

    @PuppetMaster2k 👍 😉

    Danke

    FGGF



  • Kann wer erklären, warum das erste Beispiel am Anfang nicht richtig funktioniert?
    Habe zur Zeit wohl das gleiche Problem. Konnte das soweit zurückverfolgen, das ich sagen kann, das die ersten 160 Byte richtig gelesen werden, und dann auf einmal von einer ganz anderen Stelle in der Datei. Auf diese Weise werden bei mir von einer 700k Datei etwa 20k gelesen, dann bin ich am Dateiende.
    Was noch komisch ist, das in->tellp() nicht richtig zu funktionieren scheint. Das liefert vor dem ersten get() noch 0, danach wird, mit 7881 angefangen, hochgezählt.



  • a) empfiehlt sich mal ein grundsätzlicher seekg.
    b) Was sagen die Fehlerbits von ifstream?
    c) Wie läuft das Programm ab? ->Debugger
    ...

    Einfach mal strukturiert fehler suchen.

    -junix



  • So nen dämlicher Fehler. Hätte ja auch irgendwo stehen können, das man bei einer Binärdatei das binary-Flag beim öffnen nicht vergessen sollte. 🙄


Anmelden zum Antworten