2

我正在尝试检测文件中的最后一个字节是否是 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 结尾并被剥离。

4

1 回答 1

3

您需要以二进制模式打开文件:

FILE *filePointer = fopen("yourfile.txt", "rb");

否则文件以文本模式打开,这会将 CR-LF 字符对转换为 C '\n' 字符,并在 Windows/MSDOS 上摆脱 EOF 字符。

于 2012-11-19T20:08:53.203 回答