2016-07-20 17 views
1

Ich habe einen fstream Zeiger fileP_.
ich eine Datei öffnen mit:
fileP_.open(filePath_.c_str(), std::ios::in|std::ios::binary);
Ich habe eine Read() Funktion mit ihm ist die Definition als:
int Read(size_t offset, char *buffer, size_t *size)
Also hier las ich @size in @buffer von Position offset @offset einer Datei.
Mein Code von Read() ist so etwas wie folgt aus:eof Bit nicht gesetzt, auch wenn der Versatz größer ist als die Dateigröße

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

Der Code bis offset < filesize funktioniert gut, aber wenn ich offset > filesize geben gibt gcount()0 (was zu erwarten ist), aber ich -EIO bekommen, und ich erwarte, dass, wenn offset > filesizesize = rc = 0 .
Fehle ich irgendetwas in dem obigen Code?
Danke!

+0

Wenn Sie> filesize die Operation fehlschlägt, wird das Failbit gesetzt und lesen funktioniert nicht ... (eof wurde nicht festgelegt) – EFenix

+0

Ooh, ich bin neu in C++ und es gibt viel Verwirrung auf meiner Seite, wenn die besonderen Bits sind. Der Code wurde geändert, um zu prüfen, ob failbit nach seekg() gesetzt ist. Danke vielmals! –

+0

@AntonioGarrido Kannst du mir bitte sagen, ob noch weitere Prüfungen im obigen Code erforderlich sind, wenn ich irgendwelche Überprüfungen verpasst habe? –

Antwort

0

Wenn Sie seekg> Dateigröße der Vorgang fehlschlägt, die failbit gesetzt und gelesen funktioniert nicht ... (EOF nicht gesetzt wurde)

Wenn ein Vorgang fehlschlägt, failbit aktiviert und alle die folgende Operation wird sei no-op, bis die Statusbits gelöscht sind. In diesem Fall liest iseream :: read, wenn seekg fehlschlägt, nichts und setzt insbesondere eofbit nicht.

Auf der anderen Seite wird Eofbit nicht aktiviert, wenn die Position in der Datei "am Ende" ist. Tatsächlich wird es aktiviert, wenn der Stream das Ende der Datei erkennt, dh wenn es versucht, das nächste Zeichen zu erhalten und ein EOF zurückgegeben wird.

Im Allgemeinen ist es in C++ keine gute Idee, das Ende der Eingabe mit eofbit zu steuern. Es ist besser zu testen, ob die Operation erfolgreich war. Wenn der Vorgang fehlschlägt, testen Sie mit eofbit, ob das Problem das Ende der Datei ist.

+0

Okay! Danke vielmals! :-) –