Warum eof-Problem?
-
Nein, txt-Dateien.
-
Welchen Compiler zusammen mit welcher Standardlib verwendest du?
-
Huch Gott. Du schreibst im Zweifelsfall eine newline mehr.
Nämlich genau dann, wenn deine Source-Datei nicht mit einem newline endet.
-
Ich benutze DevC++ 4.9.9.0, da wird GCC 3.3.1 gleich mitgeliefert. Eine newline zusätzlich kann ich nicht schreiben, ich habe ja keine Leerzeile extra in der Ausgabedatei, die würde ich ja sonst im Texteditor sehen.
Die Eingabedatei sieht wie folgt aus (Zeilenende als | dargestellt):
test-datei, ohne sinn und zweck |
dafür bunt und absolut|
zuckerfrei. für risiken und|
nebenwirkungen fragen sie ihren arzt oder apotheker.| <--letzte ZeileGröße: 139 bytes
Die Ausgabedatei:
test-datei, ohne sinn und zweck |
dafür bunt und absolut|
zuckerfrei. für risiken und|
nebenwirkungen fragen sie ihren arzt oder apotheker.| <--letzte ZeileGröße: 143 bytes
Ich verstehe es nicht.
Ich hab die Dateien mal gezippt und auf http://public.rz.fh-wolfenbuettel.de/~himstedm/extern/dateien.zip ins Netz gestellt.
-
in der eingabedatei belegt ein newline ein byte. in der ausgabedatei sind es zwei, da endl vermutlich neben '\n' noch irgendwas dabei schreibt. (weiss nicht mehr, was). die lösung wäre, alle zeichen genau so zu kopieren, wie sie auch in der eingabedatei stehen.
-
doppelmuffe schrieb:
in der eingabedatei belegt ein newline ein byte. in der ausgabedatei sind es zwei, da endl vermutlich neben '\n' noch irgendwas dabei schreibt. (weiss nicht mehr, was).
Unter Windows besteht ein Zeilenumbruch aus der Kombination CR/LF, also \r\n
Unter Unix hingegen nur aus einem Line Feed (LF) also \n.
-
Wow
-
Wie genau hast Du das herausgefunden?
-
Ist das normal, wenn man mit getline zeilenweise einliest und kopiert?! Somit wäre getline ja völlig ungeeignet, oder?
-
-
zum kopieren einer Datei solltest du die Datei binär öffnen und zeichenweise kopieren.
-
Brausepaul schrieb:
Somit wäre getline ja völlig ungeeignet, oder?
Ganz im Gegenteil. getline (so wie alle Operationen für die formatierte I/O) sorgen automatisch für die korrekte LF <-> CR/LF Transformation. Vorteil: du musst nicht in deinem Code zwischen konkreten Betriebssystemen unterscheiden.
Unter Windows schreibt ein out << endl; z.B. automatisch ein CR/LF. Beim Lesen wird CR/LF automatisch in ein einzelnes LF gewandelt.
Wenn du Dateien auf binär-Ebene kopieren willst, also so, dass nachher alles genauso ist, wie vorher, dann solltest du nicht die Funktionen für die formatierte I/O verwenden. Die sind dafür gerade nicht gemacht.
-
mata schrieb:
zum kopieren einer Datei solltest du die Datei binär öffnen und zeichenweise kopieren.
Der erste Rat ist gut, den zweiten würde ich nicht unbedingt unterschreiben.