POSIX définit un fichier texte comme:
Un fichier qui contient des caractères organisés en zéro ou plusieurs lignes. Les lignes ne contiennent pas de caractères NUL et aucune ne peut dépasser {LINE_MAX} octets de longueur, y compris le caractère <newline>. Bien que POSIX.1-2017 ne fasse pas de distinction entre les fichiers texte et les fichiers binaires (voir la norme ISO C), de nombreux utilitaires ne produisent une sortie prévisible ou significative que lorsqu'ils fonctionnent sur des fichiers texte. Les utilitaires standard qui ont de telles restrictions spécifient toujours des "fichiers texte" dans leurs sections STDIN ou INPUT FILES.
Source: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
Cependant, il y a plusieurs choses que je trouve peu claires:
Un fichier texte doit-il être un fichier normal? Dans l'extrait ci-dessus, il n'est pas dit explicitement que le fichier doit être un fichier normal
Un fichier peut-il être considéré comme un fichier texte s'il contient un caractère et un seul caractère (c'est-à-dire un seul caractère qui ne se termine pas par une nouvelle ligne)? Je sais que cette question peut sembler compliquée, mais ils utilisent le mot "caractères" au lieu de "un ou plusieurs caractères". D'autres peuvent être en désaccord, mais s'ils signifient "un ou plusieurs caractères", je pense qu'ils devraient le dire explicitement
Dans l'extrait ci-dessus, il fait référence aux "lignes". J'ai trouvé quatre définitions avec une ligne dans leur nom: "Ligne vide", "Ligne d'affichage", "Ligne incomplète" et "Ligne". Suis-je censé déduire qu'ils signifient "Ligne" en raison de leur omission de "Vide", "Affichage" et "Incomplet" - ou les quatre définitions incluses sont-elles toutes considérées comme une ligne dans l'extrait ci-dessus?
Toutes les questions qui viennent après ce bloc de texte dépendent de la déduction que "caractères" signifie "un ou plusieurs caractères":
- Puis-je inférer en toute sécurité que si un fichier est vide, il ne s'agit pas d'un fichier texte car il ne contient pas un ou plusieurs caractères?
Toutes les questions qui viennent après ce bloc de texte dépendent de la déduction que dans l'extrait ci-dessus, une ligne est définie comme une "ligne", et que les trois autres définitions contenant "ligne" dans leur nom doivent être exclues:
Le «zéro» dans «zéro ou plusieurs lignes» signifie-t-il qu'un fichier peut toujours être considéré comme un fichier texte s'il contient un ou plusieurs caractères qui ne se terminent pas par un retour à la ligne?
Est-ce que «zéro ou plusieurs lignes» signifie qu'une fois qu'une seule «ligne» (0 ou plusieurs caractères plus une nouvelle ligne de fin) entre en jeu, il devient illégal que la dernière ligne soit une «ligne incomplète» (une ou plusieurs non caractères de nouvelle ligne à la fin d'un fichier)?
Est-ce que "aucune [aucune ligne] ne peut dépasser {LINE_MAX} octets de longueur, y compris le caractère de nouvelle ligne" signifie qu'il y a une limitation au nombre de caractères autorisés dans une "ligne" donnée dans un fichier texte (en passant, la valeur de LINE_MAX sur Ubuntu 18.04 et FreeBSD 11.1 est "2048")?
Réponses:
Non; l'extrait note même spécifiquement l'entrée standard en tant que fichier texte potentiel. D'autres utilitaires standard, tels que
make
, utilisent spécifiquement le fichier spécial de caractères/dev/null
comme fichier texte .Ce caractère doit être un <newline>, ou ce n'est pas une ligne , et donc le fichier dans lequel il se trouve n'est pas un fichier texte. Un fichier contenant exactement l'octet 0A est un fichier texte sur une seule ligne. Une ligne vide est une ligne valide.
Ce n'est pas vraiment une inférence, c'est juste ce qu'il dit. Le mot «ligne» a reçu une définition adaptée au contexte et c'est donc de cela qu'il parle.
Un fichier vide se compose de zéro (ou plusieurs) lignes et est donc un fichier texte.
Non, ces personnages ne sont pas organisés en lignes.
Ce n'est pas illégal , ce n'est tout simplement pas un fichier texte. Un utilitaire exigeant qu'un fichier texte lui soit donné peut se comporter de manière négative s'il est donné à la place.
Oui.
Cette définition essaie simplement de définir des limites sur ce qu'un utilitaire basé sur du texte ( par exemple,
grep
) acceptera définitivement - rien de plus. Ils sont également libres d'accepter les choses plus libéralement, et le font souvent dans la pratique. Ils sont autorisés à utiliser un tampon de taille fixe pour traiter une ligne, à supposer qu'une nouvelle ligne apparaît avant qu'elle ne soit pleine, etc. Vous lisez peut-être trop de choses.la source
printf "a" > file
serait de même pour créer un fichier texte selon cette définition. Votre réponse à 4 semble contredire vos réponses à 2 et 5, car vous suggérez quetouch file
crée un fichier texte alors que ceprintf "a" > file
n'est pas le cas.(.{0,M}\n)*
(ancré implicitement et aux deux extrémités), où\n
correspond à une nouvelle ligne et.
correspond à tout caractère qui n'est pas une nouvelle ligne, etM
est un espace réservé pour la valeur numérique LINE_MAX-1. En particulier, cela implique qu'un fichier vide est un fichier texte valide composé de zéro ligne, mais que tout fichier texte non vide doit se terminer par une nouvelle ligne (car sinon il contiendrait une ligne incomplète et une ligne incomplète n'est pas une ligne )./dev/null
est un fichier vide. Vous pensez/dev/zero
./dev/null
lit comme vide, car vous n'obtenez aucune donnée lorsque vous le lisez. Je ne suis pas sûr que cela ait beaucoup de sens de considérer les fichiers non réguliers ici, car beaucoup d'entre eux sont de nature dynamique. Cela inclut les tuyaux, les sockets, les périphériques char, qui sont essentiellement des interfaces de transport vers / depuis une autre entité. Ils ne contiennent aucun ensemble de données statiques, il serait donc plus logique de considérer les propriétés des données qui ont été transférées, au lieu des propriétés du fichier .Comme défini par POSIX:
Oui, un fichier texte est (essentiellement):
Il serait utile d'inclure également ces définitions:
3.92 Chaîne de caractères
3.195 Ligne incomplète
3.206 Ligne
3.243 Caractère de nouvelle ligne (<nouvelle>)
3.247 NUL
Notez qu'un "fichier texte" ne doit pas contenir d'octets NUL.
Alors:
Non, ce n'est pas nécessaire. Un "fichier texte" est défini en termes de ce qu'il contient lors de la lecture. Si un fichier contient "zéro ou plusieurs lignes", c'est un fichier texte. Certains fichiers, comme
/dev/stdin
, peuvent contenir un fichier texte s'ils sont lus en même temps et non lors de la prochaine lecture.Non, c'est une ligne incomplète (3.195).
Un fichier texte ne doit contenir que des «lignes incomplètes».
Oui tu devrais.
Non, un fichier vide (zéro caractère) est un "fichier texte" valide.
D'en haut: … zéro ou plusieurs lignes… . Zéro ligne (zéro caractère) est un "fichier texte" valide.
Non, une "ligne incomplète" n'est pas (techniquement) une "ligne" valide.
Le «zéro» dans «zéro ou plusieurs lignes» signifie-t-il qu'un fichier peut toujours être considéré comme un fichier texte s'il contient un ou plusieurs caractères qui ne se terminent pas par un retour à la ligne?
Non, une ligne incomplète n'est pas une "ligne". Un fichier texte ne doit pas comporter de lignes incomplètes.
… Y a-t-il une limitation du nombre de caractères autorisés dans une «ligne» donnée dans un fichier texte…?
Oui, pas plus de {LINE_MAX} octets (par opposition aux caractères) ne seront autorisés dans une ligne donnée d'un "fichier texte" valide.
La valeur de {LINE_MAX} est donnée dans le fichier <limits.h>
(lire aussi Sensible line buffer size in C? ):
Pour un système basé sur GNU, il n'y a pas de limite définie (sauf la mémoire) :
Il semble être défini
posix_lim.h
pour être 2048 (au moins pour les systèmes GNU Linux 64 bits):Il peut également être trouvé à l'aide de l' utilitaire POSIX getconf :
Connexes: Pourquoi les fichiers texte devraient-ils se terminer par une nouvelle ligne?
la source
file
utilitaire ne signale que le type de fichier pour les fichiers spéciaux, mais c'est exactement ainsi que l'utilitaire fonctionne, utilisezfile - <…
ou (Linux)file -s …
pour voir son heuristique sur le contenu du fichier d'un fichier spécial. Un fichier spécial peut avoir un contenu différent chaque fois que vous l'ouvrez, il peut donc être ou être un fichier texte à chaque fois./dev/null
est toujours un fichier texte car son contenu est toujours un fichier texte.grep
sur des fichiers, vous pouvez utilisergetconf
pour obtenir des valeurs de configuration système, par exemplegetconf LINE_MAX
, qui, par ailleurs, renvoie 2048 (octets) sur mon système (Ubuntu 16.04).getconf
permet de lire la valeur actuelle de config.