我手上确实有一个奇怪的问题。我正在读取文件并运行fread,而不是像应该的那样向前跳过6个字节,而是向后返回4092-6个字节!
这里是电话:
int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);
这里是关联的结构:
struct RoughnessReadPoint
{
S8 x;
S8 y;
S8 z;
S8 x2;
S8 y2;
S8 z2;
};
这里是显示读取内容的GDB跟踪:
216 int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);
(gdb) p ptr->_IO_read_ptr
$5 = 0x5555557cce42 "\002\017\374\016\002\373˱N\001\002\017\374\017\020\020"
(gdb) n
217 totalBytesRead += bread;
(gdb) p ptr->_IO_read_ptr
$6 = 0x5555557cce48 "˱N\001\002\017\374\017\020\020"
正如您所看到的,它按预期跳了6。
现在是问题部分:
216 int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);
(gdb) p ptr->_IO_read_ptr
$14 = 0x5555557cce4c "\002\017\374\017\020\020"
(gdb) n
217 totalBytesRead += bread;
(gdb) p ptr->_IO_read_ptr
$15 = 0x5555557cbe52 "\261N\001\002\017\374\017\002\374ͱN\001\002\017\373\017\002\374бN\001\002\017\374\017\002\373ұN\001\002\017\373\016\002\373ձN\001\002\017\373\016\002\373ױN\001\002\017\374\016\002\373ڱN\001\002\017\373\016\002\373ܱN\001\002\017\373\017\002\373߱N\001\002\017\373\017\002\373\342\261N\001\002\017\373\017\002\374\344\261N\001\002\017\373\017\002\373\347\261N\001\002\017\373\017\002\373\351\261N\001\002\017\373\017\002\373\354\261N\001\002\017\373\017\002\373\356\261N\001\002\017\374\016\002\373\361\261N\001\002\017\373\016\002\373\363\261N\001\002\017\374\016\002\373\366\261N\001\002\017\374\016\002\373\370\261N\001\002\017\374\016\002\373\373\261N\001\002\017\374\016\002\373", <incomplete sequence \375>...
注意,读指针指向BACKWARDS 4086字节。
为了很好,我也打印出在这里读取了多少字节...
(gdb) p bread
$16 = 6
有人知道发生了什么吗?
其他信息:显然,这是一个调试版本,但是在与-O2一起编译时也会发生这是用g ++编译的ubuntu 18.04该文件长约130MB,大约在文件中占83MB
如果我继续阅读,文件会一遍又一遍地接近同一点,每次都回退4086字节!
正如dbush和kaylum在评论中所说,我应该使用ftell而不是在FILE结构中使用内部变量。我的问题是我正在读取的文件-它恰好发生在内部变量跳转的同一时刻。