我正在从一个文件中读取二进制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?
提前感谢您的任何提示!
答案 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以避免同样的问题。