我正在编写一个将文件读入内存的 C 库。它跳过文件的前 54 个字节(标题),然后将其余部分作为数据读取。我使用 fseek 确定文件的长度,然后使用 fread 读取文件。
循环运行一次然后结束,因为到达 EOF(没有错误)。最后,bytesRead = 10624,ftell(stream) = 28726,缓冲区包含 28726 个值。我希望 fread 在到达 EOF 时读取 30,000 个字节并且文件位置为 30054。
C 不是我的母语,所以我怀疑我在某个地方遇到了一个愚蠢的初学者错误。
代码如下:
const size_t headerLen = 54;
FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
return -1;
}
fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
bytesRead+=result;
}
根据您使用的参考,很明显在模式标志中添加“b”就是答案。为白痴徽章寻求提名。:-)
该参考文献在第二段第二句中谈到了它(尽管不在他们的表格中)。
MSDN直到页面的一半才讨论二进制标志。
OpenGroup提到了“b”标签的存在,但表示它“没有任何作用”。