Pouvons-nous écrire nous-mêmes un personnage EOF?

La plupart des langages comme le C ++ lors de l’écriture dans un fichier, insèrent un caractère EOF même s’il manque des instructions telles que:

filestream.close

Quoi qu’il en soit, nous pouvons mettre le caractère EOF selon notre exigence, en C ++, pour une instance. Ou toute autre méthode que nous pourrions utiliser en plus des fonctions fournies en C ++.

Si vous avez besoin de demander plus d’informations, merci de bien vouloir faire un commentaire.

Merci d’avance.

EDIT: Merci pour votre soutien, mais voici un ajout à cette question:

Que faire si, nous voulons tromper le système d’exploitation et placer un caractère EOF dans un fichier et écrire des données après l’EOF afin qu’une application telle que notepad.exe ne puisse pas lire après notre caractère EOF. J’ai lu les réponses à la question liée à ce sujet et je sais maintenant que le système d’exploitation actuel ne voit généralement pas le caractère EOF mais plutôt qu’il vérifie la longueur du fichier pour avoir une idée exacte de la longueur du fichier. doit être une procédure dans le système d’exploitation qui vérifierait la longueur du fichier, puis mettrait à jour les enregistrements du fichier.

Je suis désolé si je me trompe à un moment de mon estimation, mais aidez-moi, car cela peut générer beaucoup de nouvelles idées.

Il n’y a pas de personnage EOF. EOF par définition “est différent de tout code de caractère valide”. Souvent, c’est -1. Il n’est écrit à aucun moment dans le fichier.

Il existe une valeur historique de caractère EOF (CTRL + Z) dans DOS, mais elle est obsolète ces jours-ci.

Pour répondre à la question suivante d’Apoorv: Le système d’exploitation n’utilise jamais les données du fichier pour déterminer la longueur du fichier (les fichiers ne sont en aucun cas «terminés par une valeur NULL»). Donc, vous ne pouvez pas duper l’OS. Peut-être que les vieux programmes stupides ne liront pas après le caractère CTRL + Z. Je ne supposerais pas que n’importe quelle application Windows (même le Bloc-notes) ferait cela. À mon avis, il serait plus facile de les duper avec un caractère nul ( \0 ).

Eh bien, EOF n’est qu’une valeur renvoyée par la fonction définie dans le fichier d’en-tête C stdio.h . Il est en fait retourné à toutes les fonctions de lecture par le système d’exploitation, donc dépend du système. Lorsque le système d’exploitation atteint la fin du fichier, il l’envoie à la fonction qui, dans sa valeur de retour, se positionne le plus souvent ( -1 ), mais pas toujours. Donc, pour résumer, EOF n’est pas un caractère, mais une constante renvoyée par le système d’exploitation. EDIT: Eh bien, vous devez en savoir plus sur le système de fichiers, regardez ceci.

Salut, à votre deuxième question:

encore une fois, vous devriez mieux regarder dans les filesystems . FAT est un très bon exemple, car vous pouvez trouver de nombreux articles à ce sujet et ses principes sont très similaires à ceux de NTFS. Quoi qu’il en soit, encore une fois, EOF n’est NOT a character . Vous ne pouvez pas le placer directement dans un fichier. Si vous pouviez le faire, imaginez les conséquences, même le fichier image “stupide” ne pourrait pas être lu par le système.

Pourquoi? Becouse OS fonctionne comme une structure très complexe de couches. L’un des calques est le pilote du système de fichiers. Il s’assure qu’il transfère les données de chaque système de fichiers connu du pilote. Il fournit un pont entre les applications et le système actuel de stockage de fichiers sur le disque dur.

Pour être exact, le système de fichiers FAT utilise ce que l’on appelle une table FAT – c’est une table située près du début de l’espace d’adressage du disque dur (ou de la partition) et qui contient la carte de toutes les grappes (petites cellules de stockage). OK, alors maintenant, lorsque vous souhaitez enregistrer un fichier sur le disque dur, le système d’exploitation (pilote du système de fichiers) examine la table FAT et recherche la valeur “0x0”. Cette valeur “0x0” indique au SE que le cluster dont l’adresse est décrite par l’emplacement de cette valeur dans la table FAT est libre d’écrire.

Donc, il écrit dans la première partie du fichier. Ensuite, il recherche une autre valeur “0x0” dans FAT et, le cas échéant, écrit la deuxième partie du fichier dans le cluster sur lequel il pointe. Ensuite, il modifie la valeur du premier enregistrement de la table FAT où le fichier est situé à l’adresse physique du suivant dans notre cas, la deuxième partie du fichier.

Lorsque votre fichier est entièrement stocké sur le disque dur, la dernière partie vient, elle écrit la valeur EOF souhaitée, mais dans la table FAT, pas dans la “partie données” du disque dur. Donc, lors de la prochaine lecture du fichier, il sait que c’est la fin, ne cherchez plus.

Donc, maintenant vous voyez, si vous voulez écrire manuellement la valeur EOF à l’endroit où elle n’appartient pas, vous devez écrire votre propre pilote qui pourrait réécrire l’enregistrement FAT, mais c’est pratiquement impossible à faire pour. débutants.

Je suis venu ici en parcourant les exercices de Kernighan et Ritchie C.

Ctrl + D envoie le caractère qui correspond à la constante EOF de stdio.h .

(Edit: cela concerne Mac OS X; merci à @markmnl pour avoir signalé que l’équivalent Windows 10 est Ctrl + Z )

En réalité, en C ++, aucun caractère physique EOF n’est écrit dans un fichier à l’aide des mécanismes fprintf () ou ostream. EOF est une condition d’E / S pour indiquer qu’il n’y a plus de données à lire.

Certains systèmes d’exploitation à disque anciens tels que CP / M utilisaient en réalité un 0x1A physique (caractère ASCII SUB) pour indiquer EOF, car le système de fichiers conservait uniquement la taille du fichier par blocs, de sorte que vous ne saviez jamais exactement combien de temps un fichier était en octets. Avec l’avènement de l’enregistrement des comptes de longueur réelle dans le répertoire, il n’est plus habituel d’enregistrer un caractère “EOF” dans les données du fichier “dans la bande”.

Si le caractère EOF signifie quelque chose comme Control-Z, les systèmes d’exploitation modernes n’en ont pas besoin et le moteur d’exécution C ++ n’en écrit pas un pour vous. Vous pouvez bien sûr en écrire un vous-même:

  filestream.put( 26 ); // write Ctrl-Z 

mais il n’y a aucune bonne raison de le faire. Il n’y a pas non plus besoin de faire:

  filesystem.close(); 

car le stream de fichiers sera automatiquement fermé lorsque son destructeur est appelé, mais il est (à mon avis) recommandé de le faire.

Le caractère “EOF” n’existe pas. Le fait de fermer le stream est en soi la condition “EOF”.

Lorsque vous appuyez sur Ctrl + D dans un shell Unix, cela ferme simplement le stream d’entrée standard, qui est à son tour reconnu par le shell comme “EOF” et il se ferme.

Donc, pour “envoyer” un “EOF”, fermez simplement le stream auquel le “EOF” doit être envoyé.

Sous Windows, si vous rencontrez un ASCII 26 (EOF) dans stdin, la lecture du rest des données cessera. Je crois que l’écriture de ce caractère mettra également fin à la sortie envoyée à stdout, mais je ne l’ai pas confirmé. Vous pouvez basculer le stream en mode binary comme dans cette question SO :

 #include  #include  ... _setmode(0, _O_BINARY) 

Et non seulement vous arrêterez la conversion de 0x0A en 0x0D 0x0A, mais vous aurez également la possibilité de lire / écrire 0x1A. Notez que vous devrez peut-être changer à la fois stdin (0) et stdout (1).

Sur les systèmes de fichiers modernes, EOF n’est pas un caractère, vous n’avez donc pas besoin de le publier lorsque vous avez fini d’écrire dans un fichier. Il vous suffit de fermer le fichier ou de laisser le système d’exploitation le faire pour vous lorsque votre processus se termine.

Personne n’a encore mentionné les appels système [f]truncate , qui permettent de raccourcir un fichier sans le recréer à partir de zéro.

Les fonctions truncate() et ftruncate() font que le fichier régulier nommé par path ou référencé par fd est tronqué à une taille de length octets.

Si le fichier était précédemment plus grand que cette taille, les données supplémentaires sont perdues. Si le fichier était auparavant plus court, il est étendu et la partie étendue se lit comme un octet nul ( '\0' ).

Comprenez qu’il s’agit d’une opération distincte de l’écriture de toute sorte de données dans le fichier. Le fichier est un tableau d’octets linéaire, disposé d’une manière ou d’une autre sur le disque, avec des métadonnées indiquant sa durée. truncate change les métadonnées.