fputs - Falsche Ausgabe??



  • warum erzeugt die zeile

    FILE *out = fopen("test.txt", "a+t");
    fputs("\r\n", out);
    fclose(out);
    

    nicht wie erwartet 0D0A in der Ausgabedatei, sondern 0D0D0A??

    mit

    fputs("\n", out);
    

    wird in die test.txt 0D0A geschrieben?

    😕



  • "t" gibt es bei fopen nicht

    aber das ist alles richtig so. im textmodus kümmert sich die C Library um die richtigen Newlines usw. wenn du es im binär modus machst (fopen(file, "wb")) dann wird genau das geschrieben was du reinschreibst.



  • Shade Of Mine schrieb:

    "t" gibt es bei fopen nicht

    da bin aich anderen meinung und meine doku sagt auch das option t exisitiert.

    oder z.B. auch: http://www.pronix.de/pronix-782.html

    aber das ist alles richtig so. im textmodus kümmert sich die C Library um die richtigen Newlines usw.

    das würde die sache natürlich erklären.
    aber das heißt auch, dass dar selbe befehl auf unterschiedlichen OS verschiedene ausgaben hat/haben kann. und das finde ich nicht mehr so toll. ist aber für mein konkretes fall egal...



  • Xqgene schrieb:

    da bin aich anderen meinung und meine doku sagt auch das option t exisitiert.

    oder z.B. auch: http://www.pronix.de/pronix-782.html

    http://www.hmug.org/man/3/fopen.html
    hier ist ein gegenbeweis 😉

    naja, du kannst mir ruhig glauben. 't' wäre sowieso redundant weil alles was nicht mit 'b' geöffnet wird, sowieso im textmodus ist.

    das würde die sache natürlich erklären.
    aber das heißt auch, dass dar selbe befehl auf unterschiedlichen OS verschiedene ausgaben hat/haben kann. und das finde ich nicht mehr so toll. ist aber für mein konkretes fall egal...

    Textmodus und Binärmodus sind 2 verschiedene sachen.

    wenn du text speichern willst, ist der textmodus praktisch, weil du immer das richtige newline einfügst. stell dir mal vor du willst dann eine textdatei die mit deinem "super editor" erstellt wurde mit einem anderen programm öffnen und alle newlines sind weg. wäre doof. deshalb wird in dem OS nativen format gespeichert.

    oder vielleicht verständlicher:
    wenn du printf("\n"); unter MacOS machst und \n nicht in \r umgewandelt werden würde, würde der user keine neue zeile sehen, sondern wahrscheinlich ein undefinierbares symbol. dito beim einlesen von user eingaben wenn der user enter drückt. dich als programmierer interessiert es nicht ob auf dieser plattform ein enter jetzt \n, \r oder \r\n ist - du willst lediglich wissen, dass der user eine neue zeile geschrieben hat -> also ein \n in C

    der binärmodus ist dafür da, wenn dich nicht der text, sondern die bytes interessieren. denn dann findet keine umwandlung statt.



  • Shade Of Mine schrieb:

    naja, du kannst mir ruhig glauben. 't' wäre sowieso redundant weil alles was nicht mit 'b' geöffnet wird, sowieso im textmodus ist.

    glaub's besser nicht 😉 wenn weder 't' noch 'b' angegeben werden, wird die datei im 'default'-modus geöffnet (das kann entweder 't' oder 'b' sein)

    If t nor b are given, it is used the default method (commonly t). In most compilers this default method is specified by the global variable _fmode defined in stdio.h.

    guckt ihr: http://www.cplusplus.com/ref/cstdio/fopen.html



  • net schrieb:

    Shade Of Mine schrieb:

    naja, du kannst mir ruhig glauben. 't' wäre sowieso redundant weil alles was nicht mit 'b' geöffnet wird, sowieso im textmodus ist.

    glaub's besser nicht 😉 wenn weder 't' noch 'b' angegeben werden, wird die datei im 'default'-modus geöffnet (das kann entweder 't' oder 'b' sein)

    Herrje, es ist ja in Ordnung, wenn man mal etwas falsches sagt oder sich zu einer Sache äußert, von der man nicht so viel versteht. Aber im Brustton der Überzeugung Stammtischwissen in die Runde zu werfen, nervt einfach nur.

    7.19.5.3#3:

    The argument mode points to a string. If the string is one of the following, the file is
    open in the indicated mode. Otherwise, the behavior is undefined.228)
    
    r              open text file for reading
    w             truncate to zero length or create text file for writing
    a              append; open or create text file for writing at end-of-file
    rb             open binary file for reading
    wb            truncate to zero length or create binary file for writing
    ab            append; open or create binary file for writing at end-of-file
    r+            open text file for update (reading and writing)
    w+             truncate to zero length or create text file for update
    a+             append; open or create text file for update, writing at end-of-file
    r+b or rb+ open binary file for update (reading and writing)
    w+b or wb+ truncate to zero length or create binary file for update
    a+b or ab+ append; open or create binary file for update, writing at end-of-file
    


  • also wieder was, das überall unterschiedlich ist. grossartig 😡



  • net schrieb:

    also wieder was, das überall unterschiedlich ist.

    s/unterschiedlich/gleich/

    Ja, das ist der Sinn von Normen. Nur weil irgendein 15 Jahre alter Borlandcompiler irgendwann mal meinte, sowas mit globalen Variablen zu regeln, ist das kein Grund, das jetzt noch in Manuals zu schreiben. Man kann die meisten Compiler mit ausreichend Schaltern recht nahe an den C89-Standard bringen, man muß nur die Schalter kennen. Und darum ignoriert man 't' und schaut, wie man dem Compiler beibringt, daß er es richtig macht.


Anmelden zum Antworten