关于c语言读取二进制文件fread问题

最近利用c的fread函数读取一个较大的二进制文件发现,第一次编译运行的时间很慢,大概10s,第二次运行的时候只需要500ms左右,如果换了数据文件出现同样的问题,是因为fread读取文件速度不稳定吗还是其他问题,有没有更有效率的二进制读取的c函数。谢谢
(注:以上编译在VC6.0和vs2005都试过,出现同样的问题。)

这个很正常,这是操作系统的缓存(cache)在起作用。

缓存:为了解决CPU速度和内存速度的速度差异而产生(CPU运算速度比内存快的多)
当程序需要读取某个文件时,实际就是把数据读入内存由CPU运算,CPU首先去缓存中找寻,查找不到就会到内存中去读取同时复制到缓存中以便下次访问,这个时候速度自然很慢,当你第二次读取该文件时,缓存中已经存在,CPU再次访问这些数据就会变的非常快。

这是和系统读取数据的方式有关的,并不是因为某个函数效率低的原因,比较明显的:
你在某个磁盘下搜索某一个文件名,第一次会比较慢,第二次就会快很多,原因就是第二次CPU需要处理的数据已经存在缓存中,处理时效率会非常高。追问

那有没有什么方法可以改善这种情况呢?因为我现在用到的程序对时间的要求比较高,谢谢。

追答

无非就是改善代码的执行效率,如果你的数据文件比较庞大,这个时间是难免的。

如果你每次需要的不是整个数据文件(只是其中某一段),你可以在保存数据文件时分几个文件保存(就是备份),读取时进行选择。其他也没什么好办法,数据量大处理时间肯定长

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-20
不太清楚哦,用系统的api再试试看看吧,OpenFile,CreateFile,ReadFile,CloseHandle等函数即可。

关于c语言读取二进制文件fread问题
当程序需要读取某个文件时,实际就是把数据读入内存由CPU运算,CPU首先去缓存中找寻,查找不到就会到内存中去读取同时复制到缓存中以便下次访问,这个时候速度自然很慢,当你第二次读取该文件时,缓存中已经存在,CPU再次访问这些数据就会变的非常快。这是和系统读取数据的方式有关的,并不是因为某个函数...

C语言fread函数读取文件问题
fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。函数原型 size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;参 数 buffer 用于接收数据的内存地址 size 要读...

c语言 fread的问题
(3)fread(&stu[i],sizeof(struct student),1,fp1);fread 只用于 2进制方式 fwrite 写成的文件,打开文件时要有 "rb".不能用于你上面写成的文本文件。(4) 读你fp1=fopen("in.txt","w") 写成的文件 要用 fp1=fopen("in.txt","r") 打开 , 用 fscanf 读取。(5) 要用fread 读取, ...

c语言的fread如何读文件和输出?
也应该是struct infor *a=new Infor;你的类型都不对。更可怕的是,你竟然不释放空间,没有delete,那么你程序运行一次,内存就丢失一部分,我们叫他内存泄漏。 你的程序为什么是乱码,又不能读到数据,原因是fread(void *ptr, int size, int nitems, FILE *stream);是从stream这个文件流中,读取n...

C语言二进制文件的读取问题
C语言中二进制文件的读取要用fread和fwrite来实现。fwrite()与fprintf()是不同的。fwrite将写入的数据作为文件的磁盘内容保存。fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存。fprintf做了一个转换的工作。当打开文件时,记事本会自动把文件的磁盘内容作为ASCII码转换成对应的字符,...

C语言:文件操作( fread 函数 )
C语言中的文件操作, fread函数是一个关键工具,用于从文件中读取数据到内存缓冲区。它的主要作用是读取指定数量的字节到指定的缓冲区,参数包括目标缓冲区(buffer)、每个基本单元的字节数(size)、需要读取的基本单元数量(count)、指向文件的指针(stream),返回实际读取的基本单元个数。在处理大文件...

C语言fread()函数读取出问题,求大神解答
fread() 用于2进制文件的读。被读的文件应当是2进制文件,并且是用 fwrite() 写成的。文件打开 必须 用到 "b" (2进制) -- "rb" "wb" ...又读又写文件,注意文件指针位置的控制,般动,回绕文件等等,并保证文件及时写出(调 fflush() )。分别读,写文件,注意文件 关闭,文件打开的顺...

C语言fread为什么会读取失败呢?
fread是用来读取文件的函数,其形式为 size_t fread ( void *buffer, size_t size, size_t count, FILE *file) ;功能为从文件指针file中,每次读取size长度数据,读取count次,并将结果存到buffer中。其出错的可能原因包括:1 文件没有打开,或打开失败。即文件指针非法。当文件不存在,或用户对...

C语言fread函数问题
函数的返回值是实际读出元素的个数。fwrite的第二和第三个参数及返回值的含义同上。用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了...

c语言fread读取文件失败
这种文本文件一般用不着使用二进制读写 在用二进制读写时需要注意,文本文件中有看不见的字符,比如换行符,在读取时必须考虑它们占用的字符。建议:char buffer[256];if ( pFd=fopen("\/20190124.txt","r") ) { if ( !feof(pFd) ) { fgets(buffer,255,pFd); sscanf(buffer,"%s",versi...

相似回答