Zeichenweise lesen - Problem
-
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?
-
write() gibt Dir, genauso wie read(), die Anzahl Zeichen zurück.
Schreib Dir jeder read/write mal auf die Console oder poste den
kompletten Code.
-
Also schon beim 2 Schleifen durchgang gibt write() -1 zurück.
Mehr Code habe ich eigentlich auch nicht habe in der main() nur noch en Menü.
-
Scheppertreiber schrieb:
EOF ist kein Fehler. Eher ein Status der heißt "Hier ist nix mehr".
Binär mit open() öffen und gut is.Big Brother schrieb:
Sollte das Kopieren tatsächlich vor EOF abgebrochen werden,
dann lass dir strerror(errno), bzw. mit WinApis GetLastError den
Fehlercode anzeigen.@Planless
ich vermute mal, du hast bei der ersten Versionchar c;
statt
int c;
deklariert. Das wäre ein Grund warum vor EOF abgebrochen wird. Wenn du int c; deklarierst, funzt das, ansonsten ist dein Compiler puddepäng.
Gruß,
B.B.
-
Big Brother hattest recht.
Also mit fopen() etc. geht es jetzt.
Nur warum geht es nicht mit open() etc.?