Zeichenweise lesen - Problem



  • Hallo,
    ich habe ein Programm geschrieben das ne Kopie von ner Datei machen soll.
    Nur leider hört fgetc() irgendwann auf zu lesen.
    Hier erstmal der Code:

    int read_file {
       FILE *f1,*f2;
       int c;
    
          f1 = fopen("Test.txt","r");
    	     if(f1 == NULL) {
    		   printf("Error : Konnte Datei nicht öffnen\n");
    		   return 1;
    		 }
    
    	  f2 = fopen("result.txt","w");
    	     if(f2 == NULL) {
    		   printf("Error : Konnte Datei nicht oeffnen\n");
    		   return 1;
    		 }
    
    		 while((c=fgetc(f1)) != EOF) {
    			 printf("%c\n",c);
                             fputc(c, f2);
    		 }
    		 fclose(f1);
    		 fclose(f2);
       return 0;
    }
    

    Habe das Programm eigentlich geschrieben um den Umgang mit Stream zu üben,habe aber ehrlich gesagt nicht gedacht das das so schwer wird.
    -.-
    Also kann mir jemand sagen was ich falsch mache?



  • In der ersten Zeile muss es int read_file () heißen, aber ansonsten funktioniert das Programm einwandfrei.

    Planless schrieb:

    Nur leider hört fgetc() irgendwann auf zu lesen.

    Soll es doch auch. Es hört dann auf, wenn das erste File am Ende angelangt ist.



  • Ja da hast du mich verkehrt verstanden.
    fgetc() hört auf zu lesen bevor das Ende der Datei erreicht ist.



  • EOF = End OF File.

    dh, das Programm hört auf, in die Datei zu schreiben wenn es das erkennt.
    Ich denke, das Programm ist so ok.



  • Ok also wenn ich das ganze mit Textdateien mache geht es.
    Wenn ich aber ne Exe kopieren will (Nein ich will kein CopyFile) dann geht es wieder nicht.
    -.-



  • Eine exe ist ja auch keine Textdatei, das funktioniert iA nicht
    mit den stream-Funktionen. Mit open() aufmachen, nachsehen wie groß
    das File ist, Speicherplatz allozieren, lesen und mit der gleichen
    Größe wegschreiben. Etwas anderes macht CopyFile() auch nicht.



  • Der Fehler liegt darin, daß die Dateien binär gelesen und geschrieben werden sollten, d.h.:

    f1 = fopen("Test.txt","rb");
    
    f2 = fopen("result.txt","wb");
    

    Unter einigen Systemen wird das ASCII-Zeichen 26 (^Z) als EOF bei Textdateien erkannt.



  • Th69 schrieb:

    Der Fehler liegt darin, daß die Dateien binär gelesen und geschrieben werden sollten, d.h.:

    f1 = fopen("Test.txt","rb");
    
    f2 = fopen("result.txt","wb");
    

    Unter einigen Systemen wird das ASCII-Zeichen 26 (^Z) als EOF bei Textdateien erkannt.

    Wenn ich binär lese und schreibe erhalte ich in der Ausgabedatei nur:

    MZ  

    Also klappt leider nicht.
    -.-



  • was für rechner architektur, welchen compiler, welches betriebssystem du hast.



  • Planless schrieb:

    Wenn ich binär lese und schreibe erhalte ich in der Ausgabedatei nur:

    MZ  

    Also klappt leider nicht.

    hast du vielleicht eine .exe gelesen?
    --> http://www.fileformat.info/format/exe/corion-mz.htm
    🙂



  • Ja ich will mir sozusagen ne CopyFile() Funktion selber schreiben zum lernen.
    System ist Windows Vista.



  • Nee fricky. MZ ist ein Motorrad 😉



  • Planless schrieb:

    Wenn ich binär lese und schreibe erhalte ich in der Ausgabedatei nur:

    MZ  

    Also klappt leider nicht.
    -.-

    Das ist noch kein Anzeichen dafür, das es nicht klappt.
    Wenn das im Original so drin steht, dann auch in der Kopie, ne.
    Hast du die Dateigrößen verglichen?

    Sollte das Kopieren tatsächlich vor EOF abgebrochen werden,
    dann lass dir strerror(errno), bzw. mit WinApis GetLastError den
    Fehlercode anzeigen.
    http://msdn.microsoft.com/en-us/library/ms680582(VS.85).aspx



  • EOF ist kein Fehler. Eher ein Status der heißt "Hier ist nix mehr".
    Binär mit open() öffen und gut is.



  • Scheppertreiber schrieb:

    Nee fricky. MZ ist ein Motorrad

    jo, so'ne zweitakt zonen-säge. ich hätte mir fast mal eine geholt, aber die RD350 fand ich dann doch besser.
    🙂



  • Na also, exe ist ein Ostprodukt 😃 😃 😃

    (fahre Dnepr MT11, 2 Stücker und einiges in der Scheune)



  • Scheppertreiber schrieb:

    (fahre Dnepr MT11, 2 Stücker und einiges in der Scheune)

    zwei stück? eine wiegt doch schon für vier. *fg*
    🙂



  • Habe es jetzt mal mit open() probiert aber in der Ausgabe Datei sind 0 Bytes.
    -.-

    int read_file(char *file) {
       int in,out;
       char puffer[1024];
    
         in = open("Test.exe",O_RDONLY|O_BINARY);
    
    	   if(in == -1) {
    		   printf("Error : Konnte Datei nicht öffnen\n");
    		   return 1;
    	   }
    
    	  out = open("result.exe",O_WRONLY|O_CREAT);
    	     if(out == -1) {
    		   printf("Error : Konnte Datei nicht oeffnen\n");
    		   return 1;
    		 }
    
    		 while((read(in,puffer,1024)) == 0) {
    		    write(out,puffer,strlen(puffer));
    		 }
    		 close(in);
    		 close(out);
    }
    

    Habe noch nie mit open() etc. gearbeitet.
    Was ist verkehrt?



  • ;fricky schrieb:

    eine wiegt doch schon für vier. *fg* 🙂

    Ich auch - hehe 😃

    Hi Planloser,

    es wird doch einen Grund haben, daß Du die Datei binär liest.

    while((read(in,puffer,1024)) == 0) {
                write(out,puffer,strlen(puffer));
    }
    

    Schau doch mal, was Dir read() zurückgibt - Richtig, die Anzahl der
    gelesenen Zeichen (an dieser Stelle ein dreifach frühliches "rtfm").

    Als, wenn, dann so:

    while(( cnt = read(in,puffer,1024)) != 0) {
                write(out,puffer,cnt);
    }
    


  • Ah danke.
    Also die Orginal Exe Datei hat eine größe von 319kb.
    Die "Kopie" nur 63,3kb. Die Kopie lässt sich auch nicht starten. Also würde ich mal sagen das am Code immernoch was verkehrt ist oder?


Log in to reply