web-dev-qa-db-fra.com

Pouvons-nous écrire un caractère EOF nous-mêmes?

La plupart des langages comme C++ lors de l'écriture dans un fichier, mettent un caractère EOF même si nous manquons d'écrire des instructions comme:

filestream.close

Quoi qu'il en soit, nous pouvons mettre le caractère EOF selon nos besoins, en C++, par exemple. Ou toute autre méthode que nous pouvons utiliser en dehors 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 le EOF afin qu'une application comme notepad.exe ne peut pas lire après notre caractère EOF. J'ai lu les réponses à la question liée à ce sujet et j'ai appris que le système d'exploitation actuel ne voit généralement pas de EOF caractère vérifiez plutôt la longueur du fichier pour avoir la bonne idée de connaître la longueur du fichier mais, il doit y avoir 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 quelconque de mon estimation, mais s'il vous plaît, aidez-moi car cela peut conduire à beaucoup de nouvelles idées.

38
Apoorv Saxena

Il n'y a pas de caractère EOF. EOF par définition "est différent de tout code de caractère valide". Souvent, il est -1. Il n'est pas écrit dans le fichier à tout moment.

Il existe un historique EOF valeur de caractère (CTRL + Z) sous DOS, mais il est obsolète de nos jours.

Pour répondre à la question de suivi 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 le null"). Vous ne pouvez donc pas tromper le système d'exploitation. Peut-être que les anciens programmes stupides ne liront pas après le caractère CTRL + Z. Je ne suppose pas que n'importe quelle application Windows (même le Bloc-notes) ferait cela. Je suppose qu'il serait plus facile de les tromper avec un null (\0) personnage.

50
ypnos

Eh bien, EOF est juste une valeur renvoyée par la fonction définie dans le C stdio.h En tête de fichier. Il revient en fait à toutes les fonctions de lecture du système d'exploitation, donc son système dépend. Lorsque l'OS atteint la fin du fichier, il l'envoie à la fonction qui, dans sa valeur de retour, place 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 regarder mieux dans filesystems. FAT est un très bel exemple, car vous pouvez trouver de nombreux articles à ce sujet, et ses principes sont très similaires à NTFS. Quoi qu'il en soit, encore une fois, EOF est NOT a character. Vous ne pouvez pas le placer directement dans le fichier. Si vous pouviez le faire, imaginez les conséquences, même un fichier image "stupide" ne pourrait pas être lu par le système.

Pourquoi? Becouse OS fonctionne comme une structure de couches très complexe. L'une des couches 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 actuall de stockage de fichiers sur le disque dur.

Pour être exact, le système de fichiers FAT utilise ce qu'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 elle contient une carte de tous les clusters (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 système d'exploitation que le cluster dont l'adresse est décrite par l'emplacement de cette valeur dans la table FAT est libre d'écrire.

Il y écrit donc la première partie du fichier. Ensuite, il recherche une autre valeur "0x0" dans FAT, et s'il est trouvé, il écrit la deuxième partie du fichier dans le cluster vers lequel il pointe. Ensuite, il modifie la valeur du premier enregistrement de la table FAT où le fichier est situé à l'adresse physique de la suivante dans notre cas, la deuxième partie du fichier.

Lorsque votre fichier est entièrement stocké sur le disque dur, il y a maintenant la partie finale, il écrit la valeur EOF) souhaitée, mais dans la table FAT, pas dans la "partie données" du disque dur. le fichier est lu la prochaine fois, il sait que c'est la fin, ne cherchez plus.

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

13
B.Gen.Jack.O.Neill

Je suis venu ici en passant par les exercices Kernighan & Ritchie C .

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

(Edit: c'est sur Mac OS X; merci à @markmnl pour avoir souligné que l'équivalent de Windows 10 est Ctrl+Z)

12
chbrown

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

Certains premiers systèmes d'exploitation sur disque comme CP/M utilisaient en fait un 0x1A physique (caractère ASCII SUB) pour indiquer EOF parce que le système de fichiers ne maintenait la taille des fichiers en blocs que vous ne saviez jamais exactement combien de temps un Avec l'avènement du stockage des comptages de longueur réels dans le répertoire, il n'est plus courant de stocker un caractère "EOF" dans le cadre des données de fichier "intrabande".

7
Amardeep AC9MF

Sous Windows, si vous rencontrez un ASCII 26 (EOF) dans stdin, il cessera de lire le reste des données. Je crois que l'écriture de ce caractère mettra également fin à la sortie envoyée à stdout, mais je n'ai pas pas confirmé. Vous pouvez basculer le flux en mode binaire comme dans cette SO question :

#include <io.h>
#include <fcntl.h>
...
_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 également. Notez que vous devrez peut-être changer à la fois stdin (0) et stdout (1).

5
Malvineous

Le caractère "EOF" n'existe pas. Le fait de fermer le flux en soi est la condition "EOF".

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

Donc, pour "envoyer" un "EOF", il suffit de fermer le flux vers lequel le "EOF" doit être envoyé.

4
rustyx

Si par le caractère EOF vous voulez dire quelque chose comme Control-Z, alors les systèmes d'exploitation modernes n'ont pas besoin d'une telle chose, et le runtime C++ n'en écrit pas pour vous. Vous pouvez bien sûr é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 flux de fichiers sera automatiquement fermé pour vous lorsque son destructeur sera appelé, mais c'est (je pense) une bonne pratique de le faire.

4
anon

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 normal nommé par path ou référencé par fd est tronqué à une taille de précisément 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 des octets nuls ('\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 linéaire d'octets, disposé d'une manière ou d'une autre sur le disque, avec des métadonnées qui indiquent sa durée; truncate modifie les métadonnées.

3
zwol

Sur les systèmes de fichiers modernes EOF n'est pas un caractère, vous n'avez donc pas à le publier lorsque vous avez terminé 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.

2
mouviciel

Oui, vous pouvez ajouter manuellement EOF à un fichier. 1) dans Mac terminan, créer un nouveau fichier. touch filename.txt

2) Ouvrez le fichier dans VI

vi filename.txt

3) En mode Insertion (appuyez sur i), tapez Control + V puis Control + D. Ne lâchez pas la touche Ctrl du Mac.

Alternativement, si je veux d'autres ^ NewLetters, comme ^ N ^ M ^ O ^ P, etc., je pourrais faire Contorl + V puis Control + NewLetter. Ainsi, par exemple, pour faire ^ O, maintenez le contrôle enfoncé, puis tapez V et O, puis lâchez Contrôle.

0
Gene