我正在尝试检测文件中的最后一个字节是否是control-z(MS-DOS发起的文件字节末尾 - 0x1A),但我没有任何成功。我正在使用
fseek(filePointer,-1,SEEK_END);
隔离最后一个字节,然后我正在使用
fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer);
尝试读取最后一个字节。
当我尝试读取该字节时,我基本上会得到垃圾,我想知道 fread 是否默认忽略了 0x1A 字节,或者人们过去在这样做时是否遇到过任何其他古怪的行为。
当前出现故障的逻辑正在尝试读取最后一个字节,并考虑如果 fread 返回 0 则找到的文件标记的末尾(fread 应该返回读取的元素数,对吧?
if(fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer) == 0)
{
// strip off the last byte
}
编辑:我应该补充一点,在调用 fopen 后,我遇到的问题出现了,BOM 被写入,并且 BOM 的第 3 个字节被错误地认为是文件标记的0xA1末尾并被剥离。
您需要在二进制模式下打开文件:
FILE *filePointer = fopen("yourfile.txt", "rb");
否则,文件将以文本模式打开,这会将 CR-LF 字符对转换为 C'' 字符,并在 Windows/MSDOS 上删除 EOF 字符。