fread

时间:2018-06-19 06:52:43

标签: c++ readfile fread seek

我正在从一个文件中读取二进制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?

提前感谢您的任何提示!

2 个答案:

答案 0 :(得分:3)

用户@ alan-birtles和@ remy-lebeau都是对的,我把它作为文本而不是二进制文件打开了。

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

PS。对于begginers,这意味着打开文件“rb”而不是“r”。

答案 1 :(得分:1)

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

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

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

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