c - 读取函数在文件中向后跳过 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 个字节!
解决方案
正如 dbush 和 kaylum 在评论中所说,我应该使用 ftell 而不是在 FILE 结构中使用内部变量。我的问题在于我正在阅读的文件 - 它恰好发生在内部变量跳转的同一点。
推荐阅读
- javascript - 如何返回计数结果而不是闭包函数?
- reactjs - 在 React js 中使用材料 ui 单击复选框时未选中复选框
- java - 由于 docker pull,Shell 脚本过早退出,同时通过 ProcessBuilder 运行
- python - Python 3 XChaCha20 测试向量适用于加密但解密阶段失败
- java - 如何存储在Java中执行事件后更改的变量的最终值
- reactjs - React Native - 状态钩子更新并重新渲染组件,但没有显示
- javascript - 为什么 MySQL 连接在 nodejs 中丢失?
- handlebars.js - Handlebars helper 用于检查字符串是否不在字符串列表中?
- javascript - JavaScript中有没有办法减少递归函数调用中的调用堆栈大小?
- php - 更改显示的产品数量 WooCommerce 商店问题