[C] fopen -> append binary


#1
Hallo,

ich möchte an eine Datei ein paar Zeichen anhängen.. darunter auch Carriage Returns und Line Feeds.
Wenn ich die Datei mit fopen("name","a") öffne, wird ein LF aber zum CR LF. Daher möchte ich die Datei im Binärmodus öffnen.
Beim einfachen Lesen oder neu Schreiben geht das mit "rb" bzw. "wb", aber bei dem Parameter "ab" wird das b scheinbar komplett ignoriert.
Habe auch in keinem Manual was dazu gefunden (obwohl ich gestehen muss, dass ich erstklassig bin, wenn es daurm geht, Dinge zu überlesen).

Nun kann ich natürlich die Datei nehmen, im Binärmodus lesen, zwischenspeichern, dann im Binärmodus schreibend öffnen, die Datei wieder vollschreiben und anschließend meine drei Zeichen anhängen.
Aber geht das nicht einfacher? Ist ja nicht ganz der Sinn vom "Anhängen". :rolleyes:
 

Tobias K.

Erfahrenes Mitglied
#2
moin


Ist es denn unbedingt nötig das binär zu machen?
Wenn du wirklich nur ein LF speicherst sollte auch nur ein LF drinstehen, was der Editor das der den Inhalt anzeigt draus macht, ist wieder ne ganz andere Sache.
Wenn du z.B: ein (char)13 ausgibst, macht die Konsole auch ein (char)13 + (char)10 draus.


mfg
umbrasaxum
 
#3
Hab noch vergessen zu erwähnen, dass ich den gnu compiler gcc/g++ unter Windows benutze.

Also wenn ich im normalen Modus (fopen("...","w")) ein LF schreibe und mir die Datei mit einem Hex-Editor anschaue, sehe ich da ein CR LF.
Schreibe ich CR LF, finde ich in der Datei ein CR CR LF.
CR alleine wird korrekt geschrieben.

Man hat mir in diesem Forum gesagt, dass ich diesen Effekt durch den Binärmodus umgehen kann, was, nebenbei gesagt, auch funktioniert. :)


/edit
Hier der Link zum damaligen Thema:
http://www.tutorials.de/tutorials230427.html
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
#4
Hi.

Also bei mir funktionierts. Ich verwende Dev-C++ 4.9.8.9 mit GCC 3.2 (MinGW).

Was benutzt du denn genau? Vielleicht gibt's ein Update?

Welche Bibliotheken verwendest du denn noch? Evtl. hast du auch eine falsche Version von fopen aus einer anderen Bibliothek (win32?) erwischt?

Gruß
 
#5
Ich benutze gcc unter Cygwin.
Habe mir jetzt ein kleines Beispielprogramm gebastelt.

Code:
#include <string.h>
#include <stdio.h>

int main()
{
  FILE *f = fopen("test.txt","wb");
  fprintf(f,"line1(CR LF)\r\nline2(LF)\nline3(CR)\r");
  fclose(f);
  
  f = fopen("test.txt","ab");
  fprintf(f,"line4(CR LF)\r\nline5(LF)\nline6(CR)\r");
  fclose(f);
}
... und das funktioniert tatsächlich. Ich weiß jetzt nur nicht, ob ich lachen oder weinen soll.. ich hatte eigentlich ausgeschlossen, dass das funktioniert.
Okay, aber damit ist mein Problem hier gelöst. Der Fehler wird woanders liegen.

Danke für die Hilfe!

/edit
Wen es interessiert - ich habe meinen Fehler gefunden:
Ich habe in einem Modus meines Programms nicht in eine Datei geschrieben, sondern auf stdout. Den Modus hab ich seit Wochen benutzt und irgenwann hab ich angefangen, die Ausgaben mit "./test.exe > log.txt" umzuleiten. Und bei dem Umleiten wurde aus \n wieder \r\n und aus \r\n wurde \r\r\n.
Habe den Modus gewechselt, direkt in eine Datei geschrieben und alles läuft wunderbar. :)
 
Zuletzt bearbeitet:

Neue Beiträge