为什么fread()停在一个0的字符串?
我正在尝试使用以下二进制配置读取二进制文件
00 00 00 1A 79 20 83 DB 44 ...
使用以下function
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
找到了正确的文件大小。
至于为什么我需要字符串0s,是因为00 00 00 1A
形成一个32位整数,这恰好小到足以留下三个0x00
秒。
我怀疑在文件开头的一串0x00
被识别为EOF
,所以我尝试在文件前面填充一个字符,但它没有完全解决。
可能是什么导致了这个?
在Windows中,0x1A又名^Z
是文件结束字符。 您已在文本模式而不是二进制模式下打开文件。 当您在Windows中以文本模式打开文件时,它将一直读到文件结尾或第一个^Z
字符。
将"rb"
传递给fopen
而不是"r"
以二进制模式打开文件。