2010-04-13 3 views
0

Je développe une application sous windows, et j'utilise fstreams pour lire et écrire dans le fichier.C++ iostream ne définit pas eof bit même si gcount renvoie 0

J'écris avec fstream ouvert comme celui-ci:

fs.open(this->filename.c_str(), std::ios::in|std::ios::out|std::ios::binary); 

et l'écriture avec cette commande

fs.write(reinterpret_cast<char*>(&e.element), sizeof(T)); 

fermer le fichier après chaque écriture avec

fs.close() 

lecture avec ifstream ouvert comme ceci:

is.open(filename, std::ios::in); 

et la lecture avec cette commande:

is.read(reinterpret_cast<char*>(&e.element), sizeof(T)); 

L'écriture va bien. Cependant, je l'ai lu dans une boucle de cette façon:

while(!is.eof()) 
{ 
    is.read(reinterpret_cast<char*>(&e.element), sizeof(T)); 
} 

et le programme continue à lire, même si la fin du fichier doit être atteint. istellg pos est 0, et gcount est égal à 0, mais le bit fail et le bit eof sont tous deux ok.

Je suis en fou sur cela, besoin d'aide ...

+0

"le bit de défaillance et le bit eof sont tous deux corrects" - par ceci voulez-vous dire qu'ils sont définis ou non? –

+2

N'utilisez jamais eof() - jetez un oeil à http://punchlet.wordpress.com/2009/12/01/hello-world pour une perspective alternative. –

+0

Merci neil c'est interressant, mais je pense que je comptais en effet sur le comportement attendu, et cela ne fonctionne toujours pas. En effet, après la dernière lecture, le curseur devrait être positionné sur le 1028ème octet. Puisque le fichier est de 1028 octets, c'est EOF. Mais ça ne marche pas. J'aimerais vraiment savoir pourquoi –

Répondre

3

Essayez ceci:

while(is.read(reinterpret_cast<char*>(&e.element), sizeof(T))) {} 

Aussi, vous devez ouvrir le istream avec le drapeau binary ainsi:

is.open(filename, std::ios::in | std:ios::binary); 

Si elle se lit pour toujours, que lit-elle? Quel type est T?

+0

T est un simple type POD, ici quelque chose comme struct a { WCHAR b [512]; } Votre solution fonctionne, merci beaucoup. Je n'arrive pas vraiment à comprendre ** vraiment ** alors que les bits fail/eof ne sont pas définis ... –

+0

Si la réponse fonctionne et vous aide, vous devez au moins l'accepter (la coche verte). Vous pouvez également voter si vous pensez que c'est une bonne réponse. –

+0

ouais désolé, il m'a dit que je devais attendre 15 secondes pour voter et je ne suis pas revenu à la suite. Aussi, je n'ai pas encore suffisamment de rep pour upvote. Mais merci ! –

Questions connexes