J’ai un fichier d’octets 2884765579. Ceci est vérifié deux fois avec cette fonction, qui renvoie ce nombre:
size_t GetSize() { const size_t current_position = mFile.tellg(); mFile.seekg(0, std::ios::end); const size_t ret = mFile.tellg(); mFile.seekg(current_position); return ret; }
Je fais alors:
mFile.seekg(pos, std::ios::beg); // pos = 2883426827, which is < than the file size, 2884765579
Cela définit le failbit. errno
n’est pas changé. Quelles mesures puis-je prendre pour résoudre ce problème?
Je suis absolument sûr que:
pos
est vraiment 2884765579 EDIT : au cas où quelqu’un rencontrerait le même problème .. Utilisez le code que j’ai écrit (fonctionne uniquement sur Windows) et beaucoup moins de maux de tête pour vous:
class BinaryIFile { public: BinaryIFile(const ssortingng& path) : mPath(path), mFileSize(0) { mFile = open(path.c_str(), O_RDONLY | O_BINARY); if (mFile == -1) FATAL(format("Cannot open %s: %s") % path.c_str() % strerror(errno)); } ~BinaryIFile() { if (mFile != -1) close(mFile); } ssortingng GetPath() const { return mPath; } int64 GetSize() { if (mFileSize) return mFileSize; const int64 current_position = _telli64(mFile); _lseeki64(mFile, 0, SEEK_END); mFileSize = _telli64(mFile); _lseeki64(mFile, current_position, SEEK_SET); return mFileSize; } int64 Read64() { return _Read(); } int32 Read32() { return _Read(); } int16 Read16() { return _Read(); } int8 Read8() { return _Read(); } float ReadFloat() { return _Read(); } double ReadDouble() { return _Read(); } void Skip(int64 bytes) { _lseeki64(mFile, bytes, SEEK_CUR); } void Seek(int64 pos) { _lseeki64(mFile, pos, SEEK_SET); } int64 Tell() { return _telli64(mFile); } template T Read() { return _Read(); } void Read(char *to, size_t size) { const int ret = read(mFile, (void *)to, size); if ((int)size != ret) FATAL(format("Read error: attempted to read %d bytes, read() returned %d, errno: %s [we are at offset %d, file size is %d]") % size % ret % strerror(errno) % Tell() % GetSize()); } template BinaryIFile& operator>>(T& val) { val = _Read(); return *this; } private: const ssortingng mPath; int mFile; int64 mFileSize; template T _Read() { T ret; if (sizeof(ret) != read(mFile, (void *)&ret, sizeof(ret))) FATAL("Read error"); return ret; } };
Vous pouvez chercher avant une position donnée, donc pos est signé. Essayez-le avec des fichiers de taille 0x7fffffff et 0x80ffffff et voyez si ce dernier déclenche le problème, c’est ce que je suppose.