首页 > 解决方案 > 读取函数在文件中向后跳过 4086 个字节而不是向前跳过 6 个字节

问题描述

我手上有一个非常奇怪的问题。我正在读取一个文件并运行一个 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>...

注意,读指针向后移动了4086 个字节。

为了更好地衡量,我还打印出了这里读取了多少字节......

(gdb) p bread
$16 = 6

有谁知道发生了什么?

其他信息:这显然是一个调试版本,但在使用 -O2 编译时也会发生这是使用 g++ 编译的 ubuntu 18.04 文件长约 130MB,这发生在文件中约 83MB 处

如果我继续阅读,文件会一遍又一遍地接近同一点,但每次只能回退 4086 个字节!

标签: clinuxfileiofread

解决方案


正如 dbush 和 kaylum 在评论中所说,我应该使用 ftell 而不是在 FILE 结构中使用内部变量。我的问题在于我正在阅读的文件 - 它恰好发生在内部变量跳转的同一点。


推荐阅读