2011-03-28 1 views
4

dans Linux, est-il normal qu'il n'y ait pas de caractère nul à la fin du fichier?dans Linux, est-il normal qu'il n'y ait pas de caractère nul à la fin du fichier

J'ai fait un fichier vide et ouvert avec le tapis de souris écrivez az.

enregistrez-le.

lorsque j'ouvre le fichier avec l'éditeur hexadécimal, il n'y a pas de caractère nul mais 0a est là. Quel caractère nul dois-je mettre la fin du fichier?

lorsque j'écris le fichier avec un appel système.

est-ce que c'est 0a? ou 0?

merci

Répondre

5

Le système de fichiers enregistre le nombre d'octets dans un fichier et tous les octets sont libres de toute valeur - aucune valeur de caractère/octet particulière n'est une valeur sentinelle réservée signifiant fin-de-fichier. Ainsi, vous pouvez avoir un NUL n'importe où dans le fichier, mais n'en avez pas besoin pour marquer la fin.

Chaque ligne dans un fichier texte doit en effet être terminée avec un saut de ligne, ASCII 10 dec, 0A hex (sous Windows ce serait un retour chariot ASCII 13 dec suivi d'un saut de ligne). Si vous créez un fichier vide ala echo > filename il aura un saut de ligne, mais seulement parce que echo affiche une ligne vide par défaut. Si vous utilisez plutôt touch filename il serait complètement vide. Lorsque vous tapez cat > filename et saisissez des éléments dans votre fenêtre de terminal/console, vous utilisez éventuellement Control-D pour déclencher une condition de fin de fichier (pour Linux/Control-Z sous DOS), mais ce caractère n'est pas stocké dans le fichier lui-même.

+0

merci. pourriez-vous me dire comment obtenir le nombre d'octets dans un fichier? comment accéder à la valeur enregistrée (à propos de la taille du fichier) par système de fichiers? –

+0

@kim: Probablement la meilleure façon portable est de fseek() à la fin du fichier, puis la position du fichier ftell(). –

+1

@Kim, @Zan: 'fseek' est certainement un moyen raisonnable. 'stat' et' fstat' peuvent aussi être très pratiques, et vous donner d'autres détails intéressants comme les horodateurs de création/modification/accès et les informations de propriété. Une autre chose utile est qu'il est prudent d'essayer de lire après la fin du fichier - les fonctions 'fread' et' read' vous indiqueront généralement combien d'octets ils lisent: moins que ce que vous avez demandé (y compris 0) indiquerait la fin du fichier. 'fgets' lit une ligne de texte délimitée par une nouvelle ligne (ou autant que possible jusqu'à la fin du fichier), et retourne NULL quand il ne peut rien lire sauf la fin du fichier. –

-1

Cela dépend de qui a implémenté le format de fichier.

7

Il n'y a généralement pas de caractère nul à la fin des fichiers sous Unix. Un fichier texte vide a zéro octet. Une ligne vide aura un caractère 0x0A (LF, saut de ligne). Les fichiers texte Unix ont une seule fin de ligne LF.

+0

merci de votre réponse. alors comment savoir si j'atteins la fin du fichier? le fichier texte a une ligne LF s'il y a au moins une ligne mais qu'en est-il du fichier binaire? –

+0

@kimtaeyun ['read (2)'] (http://man7.org/linux/man-pages/man2/read.2.html) renvoie 0 lorsque vous êtes déjà à la fin d'un fichier. Donc 'while (bytes = read (fd, buf, bufsize)) {faire quelque chose avec buf [0..bytes-1]}' est un idiome commun pour lire un fichier dans des morceaux bufsize jusqu'à EOF. –

2

0a est la nouvelle ligne de commande, aussi appelée contrôle-J ou \n. Les fichiers texte ne se terminent normalement pas avec un caractère nul dans Unix.

Questions connexes