2016-10-18 1 views
0
#include <stdio.h> 

int main() 
{ 
    FILE * fp = fopen("Introduce.txt","rt"); 

    fseek(fp,0,SEEK_END); 
    int i = feof(fp); 
    printf("%d",i); 

    fseek(fp,1,SEEK_END); 
    i = feof(fp); 
    printf("%d",i); 

    fseek(fp,-1,SEEK_END); 
    i = feof(fp); 
    printf("%d",i); 

    return 0; 
} 

J'ai essayé d'accéder à l'indicateur de position du fichier de positionnement EOF à la fin du fichier.
Mais le résultat de ce code est "000". Pourquoi cela se produit-il?Pourquoi ne puis-je pas accéder à EOF en utilisant fseek()?

+2

vous devez lire le fichier pour obtenir EOF. –

+0

** 7.21.9.2 La fonction fseek p5 ** _clare l'indicateur de fin de fichier pour le flux , puis établit la nouvelle position._ – BLUEPIXY

Répondre

3

La fonction feof() ne signale pas qu'elle est à EOF jusqu'à ce que vous essayez de lire certaines données et qu'il n'y ait aucune donnée à lire.

Vous pouvez rechercher au-delà de l'EOF actuel d'un fichier ouvert pour l'écriture (ou ouvert pour la lecture et l'écriture). Voir while (!feof(file)) is always wrong pour plus d'informations sur les raisons pour lesquelles vous avez rarement besoin d'utiliser feof() À certains égards, feof() est une fonction que vous devriez oublier - la plupart de vos programmes s'amélioreront si vous supposez qu'il n'existe pas.

2

This documentation on feof est très claire (Souligné par):

Cette fonction signale que l'état des cours d'eau tel que rapporté par le plus opération E/S récente, il ne porte pas sur la source de données associée. Par exemple, si l'E/S la plus récente était un fgetc, qui renvoyait le dernier octet d'un fichier, feof renvoie zéro. Le prochain fgetc échoue et modifie l'état du flux en fin de fichier. Seulement alors feof renvoie non nul.

Dans l'utilisation typique, le traitement de flux d'entrée s'arrête sur toute erreur; feof et ferror sont ensuite utilisés pour faire la distinction entre différentes conditions d'erreur .