2016-07-20 1 views
1

J'ai un fichier de pointeur fstreamP_.
ouvrir un fichier avec:
fileP_.open(filePath_.c_str(), std::ios::in|std::ios::binary);
J'ai une fonction Read() avec sa définition:
int Read(size_t offset, char *buffer, size_t *size)
Donc ici, je lis dans @size@buffer à partir de l'offset @offset d'un fichier.
Mon code de Read() est un peu comme ceci:Le bit eof n'est pas défini même si le décalage est supérieur à la taille du fichier

int rc = 0 
fileP_.seekg(offset); 
fileP_.read(buffer, *size); 
if (!fileP_.gcount()) { 
    if (fileP_.eof()) 
    *size = rc; 
    else if (fileP_.fail()) 
    rc = -EIO; 
.... 

Le code fonctionne bien jusqu'à ce que offset < filesize, mais si je donne offset > filesizegcount() donne 0 (ce qui est prévu) mais je reçois -EIO, et je pense que si offset > filesizesize = rc = 0 .
Ai-je raté quelque chose dans le code ci-dessus?
Merci!

+0

Si vous cherchez> filesize l'opération échoue, la failbit est définie et la lecture ne fonctionne pas ... (eof n'a pas été défini) – EFenix

+0

Ooh, je suis nouveau en C++ et il y a beaucoup de confusion de mon côté quand le particulier les bits sont. Changement du code pour vérifier si failbit est défini après seekg(). Merci beaucoup! –

+0

@AntonioGarrido pouvez-vous s'il vous plaît me guider si d'autres vérifications sont nécessaires dans le code ci-dessus si j'ai manqué des contrôles? –

Répondre

0

Si vous seekg> filesize l'opération échoue, le failbit est défini et lu ne fonctionne pas ... (a eof pas été défini)

Si une opération échoue, failbit est activé et toutes les opérations qui suivent être no-op jusqu'à ce que les bits d'état soient effacés. Dans ce cas, si seekg échoue, istream :: read ne lira rien et, en particulier, ne définira pas eofbit. D'autre part, eofbit n'est pas activé lorsque la position dans le fichier est "à la fin". En fait, il est activé lorsque le flux détecte la fin du fichier, c'est-à-dire lorsqu'il essaie d'obtenir le caractère suivant et qu'un EOF est renvoyé.

En général, en C++, il n'est pas recommandé de contrôler la fin de l'entrée avec eofbit. Il est préférable de tester si l'opération a été réussie. Lorsque l'opération échoue, testez si le problème est la fin du fichier en utilisant eofbit.

+0

Okay! Merci beaucoup! :-) –