带有恐惧的奇怪行为

Weird behaviour with fread

本文关键字:恐惧      更新时间:2023-10-16

我正在从指示下一个二进制块大小的文件中读取二进制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;

指针A是原始位置,指针B是读取该uint32_t后的位置,指针C是读取所有二进制数据后的指针,并且 PointerD只是对我认为应该是正确的行为的检查。

现在让我们看看调试:

streamSize 2653 Positions 151 156 4627 2808

为什么流读取位置也移动了 4627 而不是 2808?

提前感谢您的任何提示!

用户@alan-birtles和@remy-lebeau都是对的,我以文本而不是二进制打开它,这就是问题所在。

不幸的是,我无法将其标记为已解决。

附言。对于乞丐来说,这意味着用"rb"而不是"r"打开文件。

您需要以二进制模式打开文件。在文本模式下打开文件时,某些字符会在您阅读时更改。例如,在 Windows 上读取 '' 时返回 "\r"。要在二进制模式下打开,请在打开模式下添加"b",例如:

FILE * file = fopen("file.txt", "rb");

请注意,在编写二进制文件时需要执行相同的操作,否则会发生相同的转换。

std::fstream还需要将std::ios_base::binary传递给构造函数/打开以避免相同的问题。