来自:http://bbs.chinaunix.net/thread-355395-1-1.html
请问:feof()是怎么知道二进制文件结束的
文件的结束判断与文件的内容无关,与文件是文本还是二进制格式无关,文件内容中更不含有所谓的文件结束标志;文件的结束与否是通过文件在磁盘上存储的文件结构等信息来获知的,与其所使用的文件系统有关。Windows和Linux系统对于文件结尾的判断采取不同的方式:基于文件结束标志(如Windows的FAT文件系统)的判断方式或者基于文件长度(如Linux的ext2、ext3文件系统)的判断方式。
磁盘文件的基本存储单位不是字节,在Windows中是簇(cluster),在Linux中叫块(block)。在每个磁盘分区上都有一块专门的区域记录它们的使用情况。每个文件都是一系列簇或者块的有序集合。
在Windows中,文件采用链式存储方式。文件的起始簇的位置被记录在目录区中,从这个起始簇的簇号可以知道下一个簇的位置(通过FAT),依次类推,直到下一个簇的簇号是文件的结束标志为止。
与Windows不同,Linux文件的信息存储在inode结构中,记录着包括文件长度、组成文件的块的有序集合等信息。通过文件长度以及块的大小,能够计算出块的实际数目m。上述集合中的前m个有序块组成的子集就是文件的实际内容。显然,超出这个子集的最后一个块的文件访问就被feof()视为到了文件末尾。
这是和文件系统相关的,补充一下在fat文件系统中,表示文件结束 ,在fat12文件系统中如果簇号大于0x0ff8,表示结束;在fat16文件系统中簇号大于0xffff8,表示文件结束;在fat32 中,簇号大于0xfffffff8,表示文件结束