Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中检测Ctrl-z文件结束标记_C_File Io_Fread - Fatal编程技术网

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

如何在C语言中检测Ctrl-z文件结束标记,c,file-io,fread,C,File Io,Fread,我试图检测文件中的最后一个字节是否为control-z,但没有成功。我正在使用 fseek(filePointer,-1,SEEK_END); fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer); 隔离最后一个字节,然后使用 fseek(filePointer,-1,SEEK_END); fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePoi

我试图检测文件中的最后一个字节是否为control-z,但没有成功。我正在使用

fseek(filePointer,-1,SEEK_END);
fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer);
隔离最后一个字节,然后使用

fseek(filePointer,-1,SEEK_END);
fread(buffer, sizeof(buffer[0]), sizeof(custom_char), filePointer);
尝试读取中的最后一个字节

当我试图读取那个字节时,我基本上得到了垃圾,我想知道fread是否默认忽略了0x1A字节,或者人们在过去这样做时是否遇到过任何其他奇怪的行为

当前逻辑出现故障,正在尝试读取最后一个字节,并考虑在fread返回0时找到的文件结束标记(fread应返回读取的元素数,对吗?):

编辑:
我应该补充一点,我遇到的问题是在调用fopen、写入BOM表后出现的,BOM表的第3个字节被错误地认为是0xA1文件结束标记并被剥离。

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

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

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

当您调用
fopen
时,是否将
b
(二进制)指定为
模式
参数的一部分?@ChrisW否。不过,我正在读写文本文件。使用UTF-8标志。Ctrl+Z是一种旧的CP/M约定,它是必需的,因为它只能计算扇区,不能计算字节。在utf-8编码的文件中找到一个是恐龙和人类电影中的一种时间错误。但是,是的,当您以文本模式打开文件时,fread()已经对其进行了过滤。如果您使用的是DOS/Windows,您应该在问题中提到这一点。在其他系统上,stdio通常不会像那样咀嚼数据。@R。。很抱歉。你说得对。我使用的是DOS/Windows。不幸的是,在我的代码中,我已经包含了一些条件语句,可以确保模式是“a”或“a+”,而不是二进制。我真的只是想抓取文件的最后一个字节(char)。@Stubbs:然后你必须以二进制模式重新打开文件,作为一个单独的步骤进行检测。这是正确的答案。@Adrian McCarthy谢谢你的帮助。