【发布时间】:2018-11-28 01:17:42
【问题描述】:
我正在从指示下一个二进制块大小的文件中读取二进制 uint32_t 数据,之后我读取了该块但读取指针“移动”错误。
FILE* file = fopen("file.zip", "r");
long pointerA = ftell(file);
uint32_t streamSize = 0;
fread(reinterpret_cast<char*>(&streamSize), sizeof streamSize,1,file);
long pointerB = ftell(file);
char* zipData = new char[streamSize];
fread(zipData, sizeof(char),streamSize,file);
long pointerC = ftell(file);
fseek( file, pointerA + 4 + streamSize, SEEK_SET );
long pointerD = ftell(file);
qDebug()<<"streamSize"<<streamSize<<"Positions"<<pointerA<<pointerB<<pointerC<<pointerD;
PointerA 是原始位置,PointerB 是读取该 uint32_t 后的位置,PointerC 是读取所有二进制数据后的指针,并且 PointerD 只是检查我认为应该是正确的行为。
现在让我们看看调试:
streamSize 2653 Positions 151 156 4627 2808
为什么流读取位置也移动了 4627 而不是 2808?
提前感谢您的任何提示!
【问题讨论】:
-
您是否以二进制模式打开文件?请发帖minimal reproducible example
-
您是否偶然以文本模式而不是二进制模式打开文件?您对
fread()的第一次调用是将文件位置推进5 个字节而不是4 个字节。这可能在文本模式处理期间发生,特别是因为2653包含字节0x0A,这很好地表明文本模式有效。你的问题被标记为 C++,那你为什么使用 C 风格的文件 I/O 而不是使用 C++ 文件流? -
Remy 项目是用 c++ 制作的,但不幸的是使用这种方法是必需的(我没有选择它)