Hallo, mal eine doofe Frage bzgl. einer Speicherung von Daten in einer Textdatei. Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das? Vermutlich belegt dann ein \n sowie \cr ebenfalls eine 1 Byte große Speicherzelle? Wie erkennt man das Ende einer Textdatei bzw. die Länge?
:
Verschoben durch User
Da gibt es viele Möglichkeiten. Z.B. als Hexadezimalzahlen, die man einfach hintereinander schreibt. Will man auch mal drin lesen, kann man sie mit Leerzeichen voneinander trennen und nach einer gewissen Anzahl \r\n einfügen. Beim Lesen der Daten wird alles, was nicht '0'...'9' und 'a'...'f', oder 'A'...'F' ist, ignoriert. Die Länge erkennen? Ist vom Betriebssystem und dessen Standardroutinen für den Umgang mit Dateien abhängig...
Nachsatz: Zur Erkennung des Endes kann man natürlich auch ein spezielles Zeichen verwenden. Ansonsten gibt es auch einige Standard-Dateiformate dafür: AVR-Programmer haben dafür die *.hex Datei.
Textus schrieb: > Wie erkennt man das Ende einer Textdatei bzw. die Länge? Über die entsprechende Funktion des Betriebssystems. zB fstat und feof unter Linux.
Textus schrieb: > Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das? Vergiß nicht, daß es auch noch UTF-8 und so gibt. Also pro Buchstabe ein Byte, das war im letzten Jahrtausend mal so, als man noch ASCII und Codepages und sowas hatte. Und dann nicht beispielweise griechische Schrift zugleich mit hebräischer in einer Textdatei darstellen konnte, weil die Schriften in inkompatiblen Codepages waren. Wenn man das aber mal alles ignoriert, ebenso wie Umlaute und so, und so tut, als wäre man ein Ami im 20. Jahrhundert, für den alles außerhalb der USA eine Mischung zwischen weißen Flecken auf der Landkarte darstellt und allgemeinen Bildungslücken darstellt, dann ist jeder Buchstabe ein Byte. Mit Zeilenende - DOS/Windows macht das als \r\n, also zwei Bytes. Unix hingegen nimmt nur \n, also ein Byte. Das ist lustig, wenn man Unix-Dateien unter Windows mit Notepad liest, weil keine Zeilenumbrüche erkannt werden. Umgedreht ist das auch lustig, weil je nach Programm dann jeder Zeilenumbruch zweimal auftauchen kann, wenn man nicht vorher mit dos2unix konvertiert.
ok, dann mal eine weitere Frage: Wo finde ich denn Material, welche Header(?) und für welche Dateitypen zulässig und ggf. notwendig sind und wie ich die Dateien damit aufbauen muss? Eine Textdatei erscheint mir da als einfaches Beispiel, aber auch hier muss ja z.B. irgendwie / irgendwo das Ende definiert sein, bzw. so eine Funktion Fopen und Fclose nd wie sie alle heißen müssen ja irgendwie definiert sein, was dann eigentlich passiert.
Unter CP/M endet eine Datei mit ^Z, weil das Dateisystem nur Vielfache von 128 Byte-Sektoren abbilden kann. Das war um 1979 rum. Seitdem kennt dein Betriebssystem die bytegenaue Länge einer jeden Datei - die steht nämlich im Dateisystem. Eine Datei verhält sich wie ein Array aus Bytes. Es gibt keine Möglichkeit, den Typen einer Datei zu erfragen, ohne in die Datei hineinzuschauen. Und selbst, wenn du hineinschaust, wirst du keine 100%ige Sicherheit über den Typ haben. Einen Universalheader gibt es nicht.
Wo? Früher nahm man schlaue Bücher, heute hilft auch oft eine Internetsuche mit schlau gewählten Suchbegriffen. Ganz ohne Hirnschmalz geht's leider auch heute noch nicht...
Textus schrieb: > Wie erkennt man das Ende einer Textdatei bzw. die Länge? Was genau ist für dich alles eine Textdatei?
Textus schrieb: > aber auch hier muss ja z.B. irgendwie / irgendwo das Ende definiert sein, Das Dateisystem verwaltet das. Das weiß aufs Byte genau, wie lang eine Datei ist, egal, was drinsteht. Archaische Dateisysteme wie das weiter oben schon angesprochene CP/M konnten das nicht, da brauchte man Dateieendesteuerzeichen. Aber solche Systeme sind schon ein paar Jahrzehnte lang faktisch tot.
Textus schrieb: > mal eine doofe Frage bzgl. einer Speicherung von Daten in einer > Textdatei. > Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das? Im Prinzip liegen doch in Dateien immer "einfach Bytes hintereinander weg". > Vermutlich belegt dann ein \n sowie \cr ebenfalls eine 1 Byte große > Speicherzelle? Das kommt auf die Codierung an. Stichworte für Google sind hier ASCII, UTF-8, UTF-16 und Unicode. UTF-16 beispielsweise nutzt immer zwei Byte pro Zeichen, während ASCII und UTF-8 mit einem Byte auskommen. Es gibt auch noch UTF-32, das nutzt sogar vier Byte pro Zeichen. Textus schrieb: > Wie erkennt man das Ende einer Textdatei bzw. die Länge? Im einfachsten Fall ließt man ein Zeichen nach dem anderen ein und schaut ob es sich dabei um ein "EOF" ("end of file") handelt. Das kommt eben aber auch auf die Codierung an.
Textus schrieb: > Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das? > Vermutlich belegt dann ein \n sowie \cr ebenfalls eine 1 Byte große > Speicherzelle? So ist es. Textus schrieb: > Wie erkennt man das Ende einer Textdatei bzw. die Länge? Wie bei jeder anderen Datei auch, aus den Informationen im Verzeichniseintrag. Das OS unterscheidet nicht, ob doc, zip, mp3, exe, bat usw. Windows enthält eine Liste, wie eine Datei mit welcher Endung vorzugsweise zu behandeln ist. Du kannst aber auch z.B. eine mp3 mit einem Texteditor öffnen, nur wirst Du dann nichts hören.
Textus schrieb: > welche Header(?) und für welche Dateitypen > zulässig und ggf. notwendig sind Im Gegensatz zu vielen anderen Dateitypen haben Textdateien keinen Header, sie fangen einfach mit dem ersten Byte an (und hören mit dem letzten auf). Allgemeine Definitionen gibt es nicht, weil alle Dateitypen von irgendeinem Programmierer mal festgelegt wurden, das sind keine Normen, und viele Dateidefinitionen sind auch garnicht offengelegt (wahrscheinlich die meisten). Wenn du selbst ein Programm schreibst, das was speichert, steht es dir frei, dir den Aufbau der Datei ganz und gar selbst auszudenken. Für viele wichtige Dateitypen, z.B. .exe, findet man Unterlagen im Internet, für so etwas wie eine Word-Datei dagegen eher nicht oder jedenfalls nicht vollständig. Georg
Vielleicht zielt die Frage auch darauf ab, wie Dateien im Filesystem gespeichert werden. Also Blöcke und so.
Georg schrieb: > Im Gegensatz zu vielen anderen Dateitypen haben Textdateien keinen > Header, sie fangen einfach mit dem ersten Byte an (und hören mit dem > letzten auf). https://de.wikipedia.org/wiki/Byte_Order_Mark Man kann sich natürlich darüber streiten, ob das nun (auch) ein "Header" ist oder nicht.
Textus schrieb: > Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das? wie sonst, holistisch? > Wie erkennt man das Ende einer Textdatei bzw. die Länge? Markierungen Vorzählen/Mitzählen beim Einlesen Adressenbegrenzung/Arrays Datenformate manchmal auch gar nicht z.B. Pufferüberlauf, Stackoverflow (nicht die Internetseite) wertvolle Internetseite zu dieser Frage: http://www.torsten-horn.de/techdocs/ascii.htm
rbx schrieb: > wie sonst, holistisch? Clusterweise. https://de.wikipedia.org/wiki/File_Allocation_Table
lalala schrieb: > rbx schrieb: >> wie sonst, holistisch? > > Clusterweise. Kommt drauf an, auf welcher Ebene man's betrachtet. Im Dateisystem sind die Daten natürlich blockweise gespeichert. Für das Programm aber liegen tatsächlich "einfach Bytes hintereinander weg". "Textus" hat leider bisher nicht geschrieben hat, ob er auf Anwendungs- oder auf Systemebene unterwegs ist.
Christopher J. schrieb: > Das kommt auf die Codierung an. Stichworte für Google sind hier ASCII, > UTF-8, UTF-16 und Unicode. UTF-16 beispielsweise nutzt immer zwei Byte > pro Zeichen, während ASCII und UTF-8 mit einem Byte auskommen. Es gibt > auch noch UTF-32, das nutzt sogar vier Byte pro Zeichen. Quark! Nur UTF-32 fixiert die Zeichenlänge auf 4 Bytes. https://en.wikipedia.org/wiki/UTF-8 > UTF-8 encodes each of the 1,112,064 valid code points [...] > using one to four 8-bit bytes https://en.wikipedia.org/wiki/UTF-16 >The encoding is variable-length, as code points are encoded > with one or two 16-bit code units. https://en.wikipedia.org/wiki/UTF-32 > It is a protocol [...] that uses exactly 32 bits per Unicode code point.
Eric B. schrieb: > Es gibt >> auch noch UTF-32, das nutzt sogar vier Byte pro Zeichen. > > Quark! Nur UTF-32 fixiert die Zeichenlänge auf 4 Bytes. Genau das steht doch in dem von dir selbst zitierten Satz. Aber du musstest natürlich auch noch was dazu schreiben und dabei noch eine Beleidigung unterbringen, hoffentlich ist dir jetzt wohler. Georg
Georg schrieb: > Genau das steht doch in dem von dir selbst zitierten Satz. Da hast du jetzt aber echt ganz geschickt von den zitierten Sätzen nur den übrig gelassen, der tatsächlich richtig war. Ich hole den relevanten Teil nochmal aus dem Grab zurück: Christopher J. schrieb: > UTF-16 beispielsweise nutzt immer zwei Byte pro Zeichen, während ASCII > und UTF-8 mit einem Byte auskommen. Und das ist falsch.
Georg schrieb: > Im Gegensatz zu vielen anderen Dateitypen haben Textdateien keinen > Header, sie fangen einfach mit dem ersten Byte an (und hören mit dem > letzten auf). Nichtmal das stimmt 100%ig. Siehe "Unicode-BOM"...
c-hater schrieb: > Georg schrieb: > >> Im Gegensatz zu vielen anderen Dateitypen haben Textdateien keinen >> Header, sie fangen einfach mit dem ersten Byte an (und hören mit dem >> letzten auf). > > Nichtmal das stimmt 100%ig. Siehe "Unicode-BOM"... klar stimmt das, jede Datei fängt mit dem ersten Byte an. Auch wenn eine BOM vorhanden ist, dann steht das erste Byte an erster stelle.
Rolf M. schrieb: > Christopher J. schrieb: >> UTF-16 beispielsweise nutzt immer zwei Byte pro Zeichen, während ASCII >> und UTF-8 mit einem Byte auskommen. > > Und das ist falsch. Genau so sieht's aus. Die Unicode-Codierung, die immer nur genau zwei Byte pro Zeichen benutzt, heisst UCS-16. Die UTF-Codierungen benutzen variable Codelängen.
Peter II schrieb: > klar stimmt das, jede Datei fängt mit dem ersten Byte an. > > Auch wenn eine BOM vorhanden ist, dann steht das erste Byte an erster > stelle. Haha. Es ging natürlich um das erste Byte des Payload, falls du das nicht begriffen hast.
Textus schrieb:
>Liegen da einfach Bytes hintereinander weg, oder wie funktioniert das?
Zum Beispiel unter Linux:
Schreibe einfach mal mit einem Editor eine Textdatei,
vieleicht mit nur einem Wort. Dann Abspeichern (Test.txt).
Dann anschauen mit:
xxd -g1 Test.txt
Da siehs du dann jedes einzelne Byte in Hex-Zahlen.
Nop schrieb: > Vergiß nicht, daß es auch noch UTF-8 und so gibt. Also pro Buchstabe ein > Byte, das war im letzten Jahrtausend mal so, als man noch ASCII und > Codepages und sowas hatte. Und dann nicht beispielweise griechische > Schrift zugleich mit hebräischer in einer Textdatei darstellen konnte, > weil die Schriften in inkompatiblen Codepages waren. Reine ASCII Zeichen belegen auch in UTF8 nur ein Byte, es ist ein einfacher 'Trick' ein 7Bit ASCII Zeichen bekommt vorne eine NULL verpasst und bleibt damit als ASCII Zeichen ein Byte lang. Wenn der 'Interpreter aber vorn eine 1 findet ist es ein 'nicht ASCII Zeichen' und wird nach dem UTF8 Standart decodiert.
c-hater schrieb: > Rolf M. schrieb: > >> Christopher J. schrieb: >>> UTF-16 beispielsweise nutzt immer zwei Byte pro Zeichen, während ASCII >>> und UTF-8 mit einem Byte auskommen. >> >> Und das ist falsch. > > Genau so sieht's aus. Die Unicode-Codierung, die immer nur genau zwei > Byte pro Zeichen benutzt, heisst UCS-16. Sie heißt UCS-2, nicht UCS-16, gehört eigentlich nicht zu Unicode, und sie ist offenbar kein Bestandteil der UCS-Norm mehr. Siehe https://de.wikipedia.org/wiki/Universal_Coded_Character_Set
c-hater schrieb im Beitrag #4730887: > Rolf M. schrieb: > >> Sie heißt UCS-2, nicht UCS-16, gehört eigentlich nicht zu Unicode, und >> sie ist offenbar kein Bestandteil der UCS-Norm mehr. Siehe >> https://de.wikipedia.org/wiki/Universal_Coded_Character_Set > > Man sollte nicht alles glauben, was man in der deutschsprachigen > Wikipedia lesen kann... > > Zumindest... nicht den Link zum > entsprechenden Artikel der englischsprachigen Wikipedia gekillt. Dort > stehen nämlich die wahren Sachverhalte. Und die lesen sich dann doch ein > wenig anders... Ja? Ich lese da das gleiche, nur etwas ausführlicher. Es gibt sogar ein eigenes Kapitel, das sich mit den Unterschieden zwischen UCS und Unicode beschäftigt: https://en.wikipedia.org/wiki/Universal_Coded_Character_Set#Differences_with_Unicode Und https://en.wikipedia.org/wiki/UTF-16 sagt: > However, "UCS-2 should now be considered obsolete. It no longer refers to > an encoding form in either 10646 or the Unicode Standard."
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.