Rembobiner un ifstream objet après avoir atteint la fin du fichier
Avoir un fichier texte avec quelques caractères (disons 10), vous pouvez essayer de lire 1000 caractères.
char *buf = new char[1000];
ifstream in("in.txt");
in.read(buf, 1000);
Cela, bien sûr, sera de définir la eofbit drapeau (et le failbit n' trop), cependant, vous serez en mesure d'obtenir les caractères désirés.
Maintenant, supposons que vous souhaitez lire le fichier à nouveau (depuis le début):
in.seekg(0); //Sets input position indicator.
in.read(buf, 100); //Try to read again.
Cela ne fonctionne pas, si vous appelez
int count = in.gcount() //Charecters readed from input.
vous remarquerez que count == 0
. Le sens qu'il n'ai pas lus rien du tout.
D'où la question: Comment pouvez-vous rewing le fichier après l'avoir frappé à la fin du fichier?
OriginalL'auteur Raydel Miranda | 2015-02-04
Vous devez vous connecter pour publier un commentaire.
Solution
Utilisation claire pour le nettoyage de l'état de la ifstream avant d'appeler
seekg
. Assurez-vous de vérifier d'abord si vous n'avez pas besoin de connaître l'état par la suite.Explication
seekg définit la position de saisie, mais n'a pas clair état peu failbit n' donc, le ifstream instance "pense" il y a quelque chose de mal encore.
De la standar spécifications:
Et nous pouvons lire dans UnformattedInputFunction:
Dans la question exemple, si vous imprimez l'état avant et après la seekg, vous bénéficiez de:
C'est pourquoi!!
seekg n'est pas évident de failbit n' et pour certains, la mise en œuvre de raison, il ne fonctionne pas avec ces bits activé.
Ma conjecture
Pourquoi
seegk
ne fonctionne pas lorsque failbit n' est activé?Il a à voir avec le fait que ce morceau n'est pas activé uniquement lorsque le flux d'atteindre la fin du fichier. Et il peut y avoir des cas dans lesquels, après failbit n'est activé, utilisez
gseek
est sujette aux erreurs ou peut-montre comportement indéfini.OriginalL'auteur Raydel Miranda