C Unbekanntes Zeichen in Textdatei-Auswertung

Stannis

Lieutenant
Registriert
Juli 2011
Beiträge
549
Ich habe hier gerade mit einem eigenartigen Umstand zu kämpfen. Ich möchte ein Textfile Buchstabe für Buchstabe einlesen.
Testprogramm:
C:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char rein;
    FILE *fin = fopen("foo.txt", "r");

    for (int i=0; (rein = (char)fgetc(fin)) != EOF; i++) {
        printf("%c-", rein);
    }

    return 0;
}

Meine Textdatei ist ASCII (utf-8) codiert und enthält nur diese Zeichen:
11110000

Mit Hexdump sieht das so aus: 3131 3131 3030 3030 000a

Und die Ausführung des Programmes zeigt, dass da irgendein Zeichen mit durchkommt, dass nicht existieren sollte...
Code:
1-1-1-1-0-0-0-0-
-⏎
 
0x0a ist Line Feed. Kommt wohl vom Texteditor
 
Hi,
0A am Ende wäre nur ein Linefeed, eigentlich sollte sich bei einer Windows Datei im UTF-8 Format der Zeilenumbruch aus CR + LF also carriage return (0D) und LF (0A) zusammensetzen.

Daher kann es sein, dass der Umbruch je nach Editor angezeigt wird oder nicht.

Edit: Außerdem hast du da noch ein NUL drin, die 00 vor dem LF
 
Zuletzt bearbeitet:
EOF ist End of File. Das ist kein Zeichen in der Datei, sondern wird nur von fgetc im Code zurückgegeben um anzuzeigen, dass wir am Ende der Datei sind.
Ergänzung ()

MrTree schrieb:
Außerdem hast du da noch ein NUL drin, die 00 vor dem LF
Das kommt von der utf8 Kodierung.
Wenn wir schon dabei sind noch der Hinweis: ASCII ist nicht dasselbe wie utf8

Edit: Nein, ich glaube ich hab mich geirrt, LF müsste in utf8 eigentlich gleich sein. Das wäre utf16.
 
Zuletzt bearbeitet:
Ich verstehe dann nicht ganz, woher das 0a herkommt – von mir sicher nicht. Und es taucht auch dann auf, wenn man die Datei mit "echo" erzeugt...

ASCII ist schon das selbe wie UTF-8, wenn ausschließlich ASCII-Zeichen vorkommen. Das ist ja gerade der Witz an der Kodierung.
 
echo erzeugt imho immer ein '0A', ausser wenn '-n' als Parameter beigegeben wird. (https://www.shellscript.sh/echo.html)
Ergänzung ()

MrTree schrieb:
Edit: Außerdem hast du da noch ein NUL drin, die 00 vor dem LF
Hat er höchstwahrscheinlich nicht. Das ist imho nur die "Auffüllung" des Anzeigeprogramms auf die eingestellten 16Bit/2Byte (LSB first).
 
Zuletzt bearbeitet:
Zurück
Oben