Qu'est-ce que EOF pour les fichiers binaires? Condition? Personnage?
J'ai réussi jusqu'ici avec la connaissance que EOF
est un caractère spécial inséré automatiquement à la fin d'un fichier texte pour indiquer à sa fin. Mais maintenant, je ressens le besoin de plus de précisions sur ce point. J'ai vérifié sur Google et la page de Wikipedia pour EOF
mais ils ne pouvaient pas répondre à la question suivante, et il n'y a pas exact de Débordement de Pile liens pour ce soit. Merci donc de m'aider sur ce point:
- Mon livre dit que le mode binaire des fichiers de garder une trace de la fin de fichier à partir du nombre de caractères présents dans le répertoire du fichier. (Contrairement à des fichiers texte qui ont un caractère EOF pour marquer la fin). Alors, quelle est l'histoire de
EOF
dans le contexte de fichiers binaires? Je suis confondu parce que, dans le programme suivant, j'ai réussi à utiliser!=EOF
de comparaison lors de la lecture d'un.exe
fichier en mode binaire:#include<stdio.h> #include<stdlib.h> int main() { int ch; FILE *fp1,*fp2; fp1=fopen("source.exe","rb"); fp2=fopen("dest.exe","wb"); if(fp1==NULL||fp2==NULL) { printf("Error opening files"); exit(-1); } while((ch=getc(fp1))!=EOF) putc(ch,fp2); fclose(fp1); fclose(fp2); }
- Est
EOF
un caractère spécial"? Ou est-ce un condition comme dit Wikipedia, une condition où l'ordinateur sait quand le retour d'une valeur particulière comme-1
(EOF
sur mon ordinateur)? Exemple de "l'état" de l'être, quand un personnage-fonction de lecture a fini de lire tous les caractères, ou lorsque le caractère/la chaîne de fonctions d'e/S la rencontre d'une erreur de lecture/écriture?Fait intéressant, le Débordement de la Pile d'étiquette pour
EOF
mélangé ces deux définitions de laEOF
. La balise pourEOF
dit "Dans le domaine de la programmation, EOF est une séquence d'octets (ou un chacracter), qui indique qu'il n'y a pas plus de contenu après cela."alors qu'il est également dit dans la section "à propos" qui "Fin de fichier (couramment abrégé EOF) est une condition dans un système d'exploitation d'ordinateur, où plus de données peuvent être lues à partir d'une source de données. La source de données est généralement appelé un fichier ou un flux."
Mais j'ai un fort sentiment EOF
ne sera pas un personnage comme tous les autres de la fonction semble être de retour quand il rencontre une erreur lors de l'I/O.
Ça serait vraiment gentil de votre part si vous pouvez effacer la question pour moi.
source d'informationauteur Thokchom
Vous devez vous connecter pour publier un commentaire.
Les différentes expressions du FOLKLORE indicateurs de C à vous n'ont pas forcément quelque chose à voir avec la façon dont le système de fichiers marque la fin d'un fichier.
La plupart des systèmes de fichiers modernes connaître la longueur d'un fichier parce qu'ils l'enregistrer quelque part, séparément à partir du contenu du fichier. Les routines de lire le fichier de garder trace de l'endroit où vous êtes à la lecture et qu'ils arrêtent lorsque vous atteignez la fin. Le C routines de la bibliothèque de générer un EOF valeur de retour pour vous; ils ne sont pas de retourner une valeur qui est en fait dans le fichier.
Noter que les expressions du FOLKLORE retourné par C routines de la bibliothèque n'est pas réellement un personnage. Le C routines de la bibliothèque généralement retourner un
int
et queint
est soit une valeur de caractère ou un EOF. E. g., dans une mise en œuvre, les personnages pourraient avoir des valeurs de 0 à 255, et des expressions du FOLKLORE peut avoir la valeur -1. Lorsque la routine de bibliothèque rencontrés la fin du fichier, il n'est pas réellement voir un -1 caractère, car il n'existe pas un tel caractère. Au lieu de cela, il a été dit par le système sous-jacent de routine que la fin de fichier a été atteint, et il a répondu par retour de -1 à vous.Vieux et brut de systèmes de fichiers peuvent avoir une valeur dans le fichier qui marque la fin du fichier. Pour diverses raisons, ce n'est généralement pas souhaitable. Dans sa forme la plus simple de mise en œuvre, il est impossible de stocker des données arbitraires dans le fichier, parce que vous ne pouvez pas stocker la fin-de-fichier marqueur de données. On pourrait, toutefois, ont une mise en œuvre dans lequel les données brutes dans le fichier contient quelque chose qui indique la fin du fichier, mais les données sont transformées lors de la lecture ou de l'écriture, de sorte que l'arbitraire de données peuvent être stockées. (E. g., en “citant” la fin-de-fichier marqueur.)
Dans certains cas, des choses comme fin-de-fichier de marqueurs apparaissent également dans les cours d'eau. Cette situation est commune lors de la lecture à partir du terminal (ou un pseudo-terminal ou terminal comme le dispositif). Sur Windows, en appuyant sur ctrl-Z est une indication que l'utilisateur est fait entrer dans l'entrée, et il est traité de la même manière pour arriver à une fin-de-fichier. Cela ne signifie pas que le contrôle-Z est un EOF. Le logiciel de lecture du terminal voit contrôle-Z, il les traite comme de fin de fichier, et les retours de fin de fichier indications, qui sont probablement différents de contrôle-Z. Sur Unix, contrôle-D est souvent similaire sentinelle marquant la fin de l'entrée.
Cela devrait clarifier les choses bien pour vous.
Fondamentalement, EOF est juste une macro avec une valeur prédéfinie qui représente le code d'erreur de fonctions d'e/S, indiquant qu'il n'y a plus de données à lire.
Le fichier ne contient pas réellement un EOF. EOF n'est pas un personnage de toutes sortes - n'oubliez pas un octet peut être comprise entre 0 et 255, donc il ne serait pas logique si un fichier peut contenir un -1. EOF est un signal du système d'exploitation que vous utilisez, ce qui indique la fin du fichier a été atteinte. Remarquez comment getc() retourne un
int
- c'est-de sorte qu'il peut retourner que -1 pour vous dire le cours d'eau a atteint la fin du fichier.EOF signal est traité de la même façon pour les binaires et les fichiers de texte - la définition des binaires et des flux de texte varie selon les Systèmes d'exploitation (par exemple sur *nix binaire et en mode texte sont la même chose.) De toute façon, comme indiqué ci-dessus, il ne fait pas partie du fichier lui-même. Le système d'exploitation passe à getc() pour indiquer au programme que la fin du flux est atteinte.
De À partir de la bibliothèque C de GNU:
EOF
n'est pas un personnage. Dans ce contexte, il est -1, ce qui, techniquement, n'est pas un personnage (si vous voulez être extrêmement précis, on pourrait faire valoir qu'il pourrait être un personnage, mais c'est pas pertinent dans cette discussion).EOF
juste pour être clair, c'est la "Fin de Fichier". Pendant que vous êtes en train de lire un fichier, vous devez savoir quand s'arrêter, sinon un certain nombre de choses peuvent se produire en fonction de l'environnement si vous essayez de lire passé la fin du fichier.Donc, une macro a été conçu pour signaler que la Fin de Fichier a été atteinte au cours de la lecture d'un fichier, qui est
EOF
. Pourgetc
cela fonctionne car elle renvoie unint
plutôt qu'unchar
donc il n'y a de place supplémentaire pour revenir à quelque chose d'autre qu'unchar
de signalEOF
. D'autres appels d'e/S peuvent signalEOF
différemment, comme par la levée d'une exception.Comme un point d'intérêt, dans le DOS (et peut-être encore sur Windows?) un réel, caractère physique
^Z
a été placé à la fin d'un fichier de signal à sa fin. Donc, sur le DOS, il était en fait unEOF
caractère. Unix n'a jamais eu une telle chose.