如何在C语言中检测Ctrl-z文件结束标记

时间:2012-11-19 19:35:59

标签: c file-io fread

我正在尝试检测文件中的最后一个字节是否为control-z (the MS-DOS originating end of file byte - 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末尾并被剥离。

1 个答案:

答案 0 :(得分:3)

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

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

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