POSIX definiert eine Textdatei als:
Eine Datei, die Zeichen enthält, die in null oder mehr Zeilen angeordnet sind. Die Zeilen enthalten keine NUL-Zeichen und keine darf länger als {LINE_MAX} Byte sein, einschließlich des Zeichens <newline>. Obwohl POSIX.1-2017 nicht zwischen Textdateien und Binärdateien unterscheidet (siehe ISO C-Standard), erzeugen viele Dienstprogramme nur vorhersehbare oder aussagekräftige Ausgaben, wenn sie mit Textdateien arbeiten. Die Standarddienstprogramme, für die solche Einschränkungen gelten, geben in ihren Abschnitten STDIN oder INPUT FILES immer "Textdateien" an.
Quelle: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
Es gibt jedoch einige Dinge, die mir unklar sind:
Muss eine Textdatei eine normale Datei sein? Im obigen Auszug heißt es nicht ausdrücklich, dass die Datei eine reguläre Datei sein muss
Kann eine Datei als Textdatei betrachtet werden, wenn sie nur ein Zeichen und ein Zeichen enthält (dh ein einzelnes Zeichen, das nicht mit einem Zeilenumbruch abgeschlossen wird)? Ich weiß, diese Frage klingt vielleicht pingelig, aber sie verwenden das Wort "Zeichen" anstelle von "einem oder mehreren Zeichen". Andere mögen anderer Meinung sein, aber wenn sie "ein oder mehrere Zeichen" bedeuten, denke ich, sollten sie es explizit sagen
Im obigen Auszug wird auf "Zeilen" verwiesen. Ich habe vier Definitionen gefunden, deren Name Zeile enthält: "Leere Zeile", "Zeile anzeigen", "Unvollständige Zeile" und "Zeile". Soll ich daraus schließen, dass sie "Zeile" bedeuten, weil "Leer", "Anzeige" und "Unvollständig" weggelassen wurden - oder sind alle vier dieser Definitionen als Zeile im obigen Auszug enthalten?
Alle Fragen, die nach diesem Textblock gestellt werden, hängen davon ab, ob "Zeichen" "ein oder mehrere Zeichen" bedeuten:
- Kann ich sicher schließen, dass eine leere Datei keine Textdatei ist, da sie kein oder mehrere Zeichen enthält?
Alle Fragen, die nach diesem Textblock gestellt werden, hängen davon ab, dass im obigen Auszug eine Zeile als "Zeile" definiert ist und dass die anderen drei Definitionen, deren Name "Zeile" enthält, ausgeschlossen werden sollten:
Bedeutet die "Null" in "Null oder mehr Zeilen", dass eine Datei immer noch als Textdatei betrachtet werden kann, wenn sie ein oder mehrere Zeichen enthält, die nicht mit einem Zeilenumbruch abgeschlossen sind?
Bedeutet "null oder mehr Zeilen", dass, sobald eine einzelne "Zeile" (0 oder mehr Zeichen plus eine abschließende neue Zeile) ins Spiel kommt, die letzte Zeile als "unvollständige Zeile" (eine oder mehrere nicht Zeilenumbruchzeichen am Ende einer Datei)?
Bedeutet "keine [keine Zeile] darf die Länge von {LINE_MAX} Byte einschließlich des Zeilenumbruchs überschreiten", dass die Anzahl der Zeichen in einer bestimmten "Zeile" in einer Textdatei begrenzt ist (abgesehen vom Wert von LINE_MAX unter Ubuntu 18.04 und FreeBSD 11.1 ist "2048")?
Antworten:
Nein; Der Auszug vermerkt sogar speziell die Standardeingabe als mögliche Textdatei. Andere Standarddienstprogramme, z. B.
make
, verwenden speziell die Zeichenspezialdatei/dev/null
als Textdatei .Dieses Zeichen muss ein <Zeilenumbruch> sein, oder dies ist keine Zeile , und daher ist die Datei, in der es sich befindet, keine Textdatei. Eine Datei, die genau Byte 0A enthält, ist eine einzeilige Textdatei. Eine leere Zeile ist eine gültige Zeile.
Es ist nicht wirklich eine Folgerung, es ist nur das, was es sagt. Das Wort "Linie" wurde kontextbezogen definiert, und darum geht es hier.
Eine leere Datei besteht aus null (oder mehr) Zeilen und ist somit eine Textdatei.
Nein, diese Zeichen sind nicht in Zeilen organisiert.
Es ist nicht illegal , es ist nur keine Textdatei. Ein Dienstprogramm, das die Angabe einer Textdatei erfordert, kann sich nachteilig verhalten, wenn stattdessen diese Datei angegeben wird.
Ja.
Diese Definition versucht nur, Grenzen zu setzen, die ein textbasiertes Dienstprogramm ( zum Beispiel
grep
) definitiv akzeptiert - nichts weiter. Es steht ihnen auch frei, Dinge freizügiger anzunehmen, und das tun sie in der Praxis ziemlich oft. Sie dürfen einen Puffer mit fester Größe verwenden, um eine Zeile zu verarbeiten, anzunehmen, dass eine neue Zeile erscheint, bevor sie voll ist, und so weiter. Sie können zu viel in Sachen lesen.quelle
printf "a" > file
würde eine Textdatei nach dieser Definition erstellen. Ihre Antwort auf 4 scheint Ihren Antworten auf 2 und 5 zu widersprechen, da Sie vorschlagen, dasstouch file
eine Textdatei erstellt wird, währendprintf "a" > file
dies nicht der Fall ist.(.{0,M}\n)*
(implizit verankert und an beiden Enden)\n
übereinstimmt , wobei eine neue Zeile und ein.
beliebiges Zeichen, das keine neue Zeile ist, übereinstimmen undM
ein Platzhalter für den numerischen Wert ist LINE_MAX-1. Dies impliziert insbesondere, dass eine leere Datei eine gültige Textdatei ist, die aus Nullzeilen besteht, aber dass jede nicht leere Textdatei in einer neuen Zeile enden muss (da sie sonst eine unvollständige Zeile enthalten würde und eine unvollständige Zeile keine Zeile ist )./dev/null
ist eine leere Datei. Du denkst an/dev/zero
./dev/null
liest sich so leer, als bekommst du keine Daten, wenn du es liest. Ich bin mir nicht sicher, ob es sinnvoll ist, hier nicht reguläre Dateien zu berücksichtigen, da viele von ihnen dynamischer Natur sind. Dazu gehören Pipes, Sockets und Char-Geräte, die im Grunde nur Schnittstellen zu / von einer anderen Entität transportieren. Sie enthalten keinen statischen Datensatz, daher ist es sinnvoller, die Eigenschaften der übertragenen Daten anstelle der Eigenschaften der Datei zu berücksichtigen .Wie von POSIX definiert:
Ja, eine Textdatei ist (im Grunde genommen):
Es wäre nützlich, auch diese Definitionen aufzunehmen:
3.92 Zeichenkette
3.195 Unvollständige Zeile
3.206 Line
3.243 Newline Character (<newline>)
3,247 NUL
Beachten Sie, dass eine "Textdatei" keine NUL-Bytes enthalten darf .
So:
Nein, das muss nicht sein. Eine "Textdatei" ist definiert als das, was sie enthält, wenn sie gelesen wird. Wenn eine Datei "null oder mehr Zeilen" enthält, handelt es sich um eine Textdatei. Einige Dateien
/dev/stdin
enthalten möglicherweise eine Textdatei, wenn sie zu einem bestimmten Zeitpunkt gelesen werden und nicht, wenn sie das nächste Mal gelesen werden.Nein, das ist eine unvollständige Zeile (3.195).
Eine Textdatei darf nur nicht "unvollständige Zeilen" enthalten.
Ja du solltest.
Nein, eine leere Datei (null Zeichen) ist eine gültige "Textdatei".
Von oben: … keine oder mehrere Zeilen… . Nullzeilen (Nullzeichen) sind eine gültige "Textdatei".
Nein, eine "unvollständige Zeile" ist keine (technisch) gültige "Zeile".
Bedeutet die "Null" in "Null oder mehr Zeilen", dass eine Datei immer noch als Textdatei betrachtet werden kann, wenn sie ein oder mehrere Zeichen enthält, die nicht mit einem Zeilenumbruch abgeschlossen sind?
Nein, eine unvollständige Zeile ist keine "Zeile". Eine Textdatei darf keine unvollständigen Zeilen enthalten.
... gibt es eine Beschränkung der Anzahl der Zeichen, die in einer bestimmten "Zeile" in einer Textdatei zulässig sind ...?
Ja, eine gültige "Textdatei" darf nicht mehr als {LINE_MAX} Byte (im Gegensatz zu Zeichen) enthalten.
Der Wert von {LINE_MAX} ist in der Datei <limits.h> angegeben
( siehe auch Sensible line buffer size in C? ):
Für ein GNU-basiertes System gibt es kein festgelegtes Limit (außer Speicher) :
Es scheint
posix_lim.h
2048 zu sein (zumindest für 64-Bit-Linux-GNU-Systeme):Es kann auch mit dem POSIX- Dienstprogramm getconf gefunden werden :
Verwandte Themen : Warum sollten Textdateien mit einem Zeilenumbruch enden?
quelle
file
Dienstprogramm gibt nur den Dateityp für spezielle Dateien an, aber so funktioniert das Dienstprogramm, verwendetfile - <…
oder (Linux)file -s …
, um seine Heuristiken für den Dateiinhalt einer speziellen Datei anzuzeigen. Eine spezielle Datei kann bei jedem Öffnen einen anderen Inhalt haben, es kann sich also jedes Mal um eine Textdatei handeln./dev/null
ist immer eine Textdatei, da der Inhalt immer eine Textdatei ist.grep
auf Dateien zuzugreifen, können Siegetconf
Systemkonfigurationswerte abrufengetconf LINE_MAX
, die auf meinem System (Ubuntu 16.04) übrigens 2048 (Bytes) zurückgeben.getconf
erlaubt es, den aktuellen Wert von config zu lesen.