seekg()神秘地失败

我有一个2884765579字节文件。 这是用这个函数重复检查,返回这个数字:

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; } 

然后我做:

 mFile.seekg(pos, std::ios::beg); // pos = 2883426827, which is < than the file size, 2884765579 

这设置了故障位。 errno没有改变。 我可以采取哪些措施来解决这个问题?


绝对相信

  • 文件大小真的是2884765579
  • pos是真的2884765579
  • 失败位在.seekg()之前没有设置
  • 失败位在.seekg()后面设置,并且两者之间没有其他调用
  • 该文件用二进制标志打开

编辑 :万一有人跑到相同的问题..使用我写的代码(仅适用于Windows)和许多更less的麻烦给你:

 class BinaryIFile { public: BinaryIFile(const string& 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); } string 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<int64>(); } int32 Read32() { return _Read<int32>(); } int16 Read16() { return _Read<int16>(); } int8 Read8() { return _Read<int8>(); } float ReadFloat() { return _Read<float>(); } double ReadDouble() { return _Read<double>(); } void Skip(int64 bytes) { _lseeki64(mFile, bytes, SEEK_CUR); } void Seek(int64 pos) { _lseeki64(mFile, pos, SEEK_SET); } int64 Tell() { return _telli64(mFile); } template <class T> T Read() { return _Read<T>(); } 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 <class T> BinaryIFile& operator>>(T& val) { val = _Read<T>(); return *this; } private: const string mPath; int mFile; int64 mFileSize; template <class T> T _Read() { T ret; if (sizeof(ret) != read(mFile, (void *)&ret, sizeof(ret))) FATAL("Read error"); return ret; } }; 

Solutions Collecting From Web of "seekg()神秘地失败"

你可以在给定位置之前看到kg,所以POS被签名。 尝试使用大小为0x7fffffff和0x80ffffff的文件,看看后者是否触发问题,这是我的猜测。