gpt4 book ai didi

c++ - seekg() 神秘地失败

转载 作者:行者123 更新时间:2023-11-28 03:58:14 25 4
gpt4 key购买 nike

我有一个 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() 之前设置 failbit
  • 在 .seekg() 之后立即设置 failbit 并且其间没有进行其他调用
  • 文件以二进制标志打开

编辑:以防万一有人遇到同样的问题。使用我编写的这段代码(仅适用于 Windows)并减少您的头痛:

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

最佳答案

您可以在给定位置之前搜索,因此 pos 已签名。尝试使用大小为 0x7fffffff 和 0x80ffffff 的文件,看看后者是否会触发问题,这是我的猜测。

关于c++ - seekg() 神秘地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com