C语言中二进制文件的读取要用fread和fwrite来实现。
fwrite()与fprintf()是不同的。
fwrite将写入的数据作为文件的磁盘内容保存。fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存。fprintf做了一个转换的工作。
当打开文件时,记事本会自动把文件的磁盘内容作为ASCII码转换成对应的字符,然后再显示出来,即显示的是文本内容而不是磁盘内容。
例如,用fwrite向文件写入“65”时,文件的磁盘内容就是保存的65(磁盘上以二进制表示)。当用记事本打开文件时,记事本会读到65,并把65看作一个ASCII码,再把对应的字符“A”显示出来。因此屏幕上看到的文本内容是“A”。
而用fprintf向文件写入“65”时,文件的磁盘内容保存的是“6”和“5”这两个字符对应的ASCII码,分别是54和53。因此文件的磁盘内容是54和53。当用记事本打开文件时,记事本读到54,就显示出对应的“6”。再读到53,就显示出对应的“5”。
使用fread读取,并且fopen的时候一定要使用“rb”模式,不能使用文本模式。
fgetc只适合处理文本文件
由于数据结构是
数据长度(要求必须为int)+数据内容 (可以为char) 以二进制数据流的形式存储到各自的文件中
那么可以考虑以fread读取长度 然后再通过fread读出数据段
例如
while( fread( &data_len[i], sizeof(int) , 1 , fp )
{
fread( &data[i], data_len[i], 1, fp)
i++;
}
这个很正常,这是操作系统的缓存(cache)在起作用。
缓存:为了解决CPU速度和内存速度的速度差异而产生(CPU运算速度比内存快的多)
当程序需要读取某个文件时,实际就是把数据读入内存由CPU运算,CPU首先去缓存中找寻,查找不到就会到内存中去读取同时复制到缓存中以便下次访问,这个时候速度自然很慢,当你第二次读取该文件时,缓存中已经存在,CPU再次访问这些数据就会变的非常快。
这是和系统读取数据的方式有关的,并不是因为某个函数效率低的原因,比较明显的:
你在某个磁盘下搜索某一个文件名,第一次会比较慢,第二次就会快很多,原因就是第二次CPU需要处理的数据已经存在缓存中,处理时效率会非常高。