如何在 C 编程语言中检测文件标记的 Ctrl-z 结尾



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

最新更新