我正在尝试读取具有以下二进制配置的二进制文件
00 00 00 1A 79 20 83 DB 44 ...
使用下面的函数
static BitArray getBitArray(string filename)
{
FILE *fs = fopen(filename.data(),"r");
fseek (fs , 0 , SEEK_END);
unsigned long s = ftell (fs);
rewind (fs);
unsigned char *buffer = new unsigned char[s+1];
fread(buffer,1,s,fs);
BitArray bArray;
for(int i=0; i<s; i++)
bArray.add(buffer[i]);
delete[] buffer;
fclose(fs);
return bArray;
}
其中 BitArray
只是我自己的位操作类。问题是,对于我上面提到的bin文件,它只读取前三个0,像这样
00 00 00
即使 fseek
找到了正确的文件大小。
至于为什么需要那个字符串0,是因为00 00 00 1A
构成了一个32位的整数,刚好小到可以留下三个0x00
.
我怀疑文件开头的一串0x00
被识别为EOF
,所以我尝试在文件前面填充一个字符,但是它不太成功。
这可能是什么原因造成的?
最佳答案
在 Windows 中,0x1A a.k.a ^Z
是文件结束字符。您以文本模式而不是二进制模式打开了文件。当您在 Windows 中以文本模式打开文件时,它将一直读取到文件末尾或第一个 ^Z
字符。
将 "rb"
传递给 fopen
而不是 "r"
以二进制模式打开文件。
关于c - 为什么 fread() 在一串 0 处停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631948/