Warum eigentlich? --> Warnung: Kein Newline am Dateiende



  • Bei Codeblocks kann man einstellen, dass eine Leerzeile angehangen wird, wenn diese nicht vorhanden ist, zumindest im aktuellen SVN-Release.



  • Ein Quelltext ist eine Textdatei, und eine solche besteht aus Zeilen, und Zeilen haben ein Ende zu haben, ganz einfach 😉



  • Ein Ende hat wohl jede Zeile. Stellt sich nur die Frage, ob man als letztes noch eine vollkommen leere Zeile der Länge 0 haben muss, oder ob das vielleicht nur wegen dem include-Gefrickel so verlangt wird. 😉



  • Optimizer schrieb:

    [...] oder ob das vielleicht nur wegen dem include-Gefrickel so verlangt wird. 😉

    Jetzt geht das schon wieder los ... 🙄 😃



  • Optimizer schrieb:

    Ein Ende hat wohl jede Zeile. Stellt sich nur die Frage, ob man als letztes noch eine vollkommen leere Zeile der Länge 0 haben muss, oder ob das vielleicht nur wegen dem include-Gefrickel so verlangt wird. 😉

    Eine Textdatei mit \n am Ende hat keine vollkommen leere Zeile am Ende, sondern eine Datei _ohne_ \n am Ende ist keine gültige Textdatei! 😃



  • Optimizer schrieb:

    Ein Ende hat wohl jede Zeile.

    Richtig. Etwas, das kein Ende hat, ist damit keine Zeile.

    Stellt sich nur die Frage, ob man als letztes noch eine vollkommen leere Zeile der Länge 0 haben muss,

    Das ist keine Zeile.



  • ich will ja ned mit alten "volksliedern" kommen, aber alles hat ein ende, nur die wurst hat 2...

    das es so definiert ist war mir schon klar, der compiler wird nichts in frage stellen, was nicht definiert wurde. aber warum es so definiert wurde , da hat niemand ne ahnung, ausser das es eventuell mit den include dateien zusammenhängen könnte. Die entwickler von c/c++ müssen sich ja schon was bei gedacht haben 🙄



  • Bashar schrieb:

    Stellt sich nur die Frage, ob man als letztes noch eine vollkommen leere Zeile der Länge 0 haben muss,

    Das ist keine Zeile.

    Beweise es. Wenn ich in einem beliebigen Texteditor in diese nicht-Zeile gehe, wird mir deren Nummer angezeigt. Mein C#-Code compiliert, obwohl die letzte nicht-Zeile kein LF hat (aber nicht unwichtig für die Korrektheit des Codes ist). Zeilenvorschub lässt sich auch nicht salopp mit Zeilenende übersetzen, weil es einfach nur eine Markierung ist, die sinngemäß bedeutet, dass man an dieser Stelle nach unten in die nächste Zeile rutscht, dass alles, was danach folgt, in der nächsten Zeile steht. Zeilenwechsel != Zeilenende. Die Behauptung, dass eine Zeile ohne LF kein Ende hat (oder keine Zeile ist), ist sehr gewagt.

    Wer definiert das? Muss demzufolge ein Text einen abschließenden Absatzwechsel haben? Habe ich auch noch nie gehört, wäre aber die selbe Logik. Ich beende auch dieses Posting gerade nicht durch einen abschließenden Zeilenwechsel.



  • Eine Zeile ist/war definiert als Folge von Zeichen und einem terminalen '\n'. Vergleiche es mit direkt aufeinander folgende C-String im Speicher.

    Die meisten Texteditoren sehen ein EOF allerdings auch als Zeichenende an. Viele halten es noch nicht einmal für nötig die Zeile zu beeden bevor sie sie abspeichern.

    Fals du aber einmal unter einem primitiven Datiesystem arbeiten solltest das dir nicht die Dateilänge angibt dann wäre das Lesen einer solchen fehlerhaften Textdatei so fatal wie ein C-String ohne finales '\0'.

    PS: Es ist nicht, dass ich ein finales '\n' für wichtig halte. Ich wollte nur die Idee dahinter erklären.



  • Optimizer schrieb:

    Bashar schrieb:

    Stellt sich nur die Frage, ob man als letztes noch eine vollkommen leere Zeile der Länge 0 haben muss,

    Das ist keine Zeile.

    Beweise es. Wenn ich in einem beliebigen Texteditor in diese nicht-Zeile gehe, wird mir deren Nummer angezeigt.

    Auf deutsch, du gehst in 2 bis 3 Texteditoren, die du kennst, in diese Zeile ... tolle Begründung.

    Mein C#-Code compiliert, obwohl die letzte nicht-Zeile kein LF hat (aber nicht unwichtig für die Korrektheit des Codes ist).

    Wir reden doch über C++, oder nicht? Meditier mal über folgenden Ausschnitt aus dem C99-Draft:

    7.19.2  Streams
    
           [#1] Input and output, whether to or from  physical  devices
           such  as  terminals  and  tape drives, or whether to or from
           files supported on structured storage  devices,  are  mapped
           into logical data streams, whose properties are more uniform
           than their various inputs and outputs.  Two forms of mapping
           are supported, for text streams and for binary streams.209)
    
           [#2] A text stream is  an  ordered  sequence  of  characters
           composed  into  lines,  each line consisting of zero or more
           characters plus a terminating new-line  character.   Whether
           the  last  line requires a terminating new-line character is
           implementation-defined.  Characters may have  to  be  added,
           altered,  or  deleted  on  input  and  output  to conform to
           differing conventions for  representing  text  in  the  host
           environment.    Thus,   there   need  not  be  a  one-to-one
           correspondence between the characters in a stream and  those
           in  the  external  representation.  Data read in from a text
           stream will necessarily compare equal to the data that  were
    
           ____________________
    
           209An  implementation  need  not  distinguish  between  text
              streams and binary streams.  In such  an  implementation,
              there need be no new-line characters in a text stream nor
              any limit to the length of a line.
    
           7.19.1                     Library                    7.19.2
    
           WG14/N869   Committee Draft  --  January 18, 1999        299
    
           earlier written out to that stream only if: the data consist |
           only of  printing  characters  and  the  control  characters
           horizontal  tab  and  new-line;  no  new-line  character  is
           immediately preceded  by  space  characters;  and  the  last
           character is a new-line character.  Whether space characters
           that are written out immediately before a new-line character
           appear when read in is implementation-defined.
    

    Du wirst feststellen, dass der C-Standard sich große Mühe gibt, die exotischsten Textstreamformate zu unterstützen, denk z.B. an Lochkarten und dergleichen. Und von dem Standpunkt aus gesehen, von kleinstem gemeinsamen Nenner, ist meine Aussage gemeint.


Anmelden zum Antworten