当输入文件为二进制,长度远大于4096的时候。
由于文件流缓冲默认为4095.
那么假设已经读取了4080个字节之后,即fp_in->_cnt的值为15,再使用fread(g_buffer, 1, 20, fp_in);函数打算一次性读出20个字节时,程序异常,fread执行时报Access Violation.
有高手帮忙解释下吗?按道理说,文件流缓冲中剩余长度不足的时候,应该会自动从外存文件中一次性读入4096个字节到缓冲中才对呀,有高手帮忙指点下吗?
你没理解我的意思,
buffer指向的内存区的大小的count是够大的。
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
关键问题是(count*size)如果大于stream->_cnt时,难道fread就搞不定了吗?
如果大于count,则读一次等于count的值,再用如lseek等函数把指针指向你现在已经读到了的位置,再读。一般用一个循环。
本回答被网友采纳C语言中fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题...
fread在fp_in缓冲区中剩余字节为0的时候才会产生一个异常让内核去处理,内核收到这个异常,就会读取文件,将fp_in的缓冲区重新填满。也就是说:如果只剩下15个了,你要读20个,那么就会先读15个到g_buffer里,然后产生一个异常,内核重新填满缓冲区,然后再从缓冲区里读5个字节。
关于CE系统中用fread函数读取SD卡文件耗时的疑问
首先,我也不是很懂, 但是感觉是在开始读写流的时候首先把存储的区域复制到了一块缓冲里.哈哈,终于找到了:标准I\/O库提供的缓冲的目的是尽可能减少使用read和write调用的次数.它也对每个I\/O流自动地进行缓冲管理.一般文件的fread和fwrite是全缓冲.在这种情况下, 在填满I\/O缓冲区后才进行实际的I\/O...
C语言高手帮忙:fread 函数的问题
用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了多少数据。如果用fread(temp,1,1024,fp),则程序每次返回读出数据的字节数,即使读...
C语言fread函数问题
用fread(temp,1024,1,fp)也能读出,意思是一个元素的大小是1024个字节,每次读取一个,这在读取前面内容时没问题,当读到最后,加入只剩下100个字节的数据,不足1024字节时,程序返回0,你无法知道程序最后一次读出了多少数据。如果用fread(temp,1,1024,fp),则程序每次返回读出数据的字节数,即使读...
C语言 fread函数的问题
首先,fread读出的信息必须是fwrite写入的信息才能保证 读出信息的正确性 所以 你要读 就会读出一个学生的信息 而且你不会读出20字节的名字 地址同理 确定结构体的大小可以用sizeof关键字 下面是fwrite fread的函数原型 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream...
C语言:文件操作( fread 函数 )
C语言中的文件操作, fread函数是一个关键工具,用于从文件中读取数据到内存缓冲区。它的主要作用是读取指定数量的字节到指定的缓冲区,参数包括目标缓冲区(buffer)、每个基本单元的字节数(size)、需要读取的基本单元数量(count)、指向文件的指针(stream),返回实际读取的基本单元个数。在处理大文件...
C语言fread函数问题
如果读取的是正确的文件(就是你先前用同样结构写了数据的那个文件),那就是对的 为了防止读错误的文件,可以在文件头加一个标志,文件头符合标志的才继续读取,否则不读,提示错误 一般可以用文件的大小来确定有多少个记录,一直读到EOF,记录读到的字节数,除以结构的字节数,得到共有多少个结构体 ...
C语言fread函数怎么用啊?为什么我写出来输出数据不对,
C语言中:fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。函数原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;参数:buffer 用于接收数据的内存地址...
关于c语言读取二进制文件fread问题
当程序需要读取某个文件时,实际就是把数据读入内存由CPU运算,CPU首先去缓存中找寻,查找不到就会到内存中去读取同时复制到缓存中以便下次访问,这个时候速度自然很慢,当你第二次读取该文件时,缓存中已经存在,CPU再次访问这些数据就会变的非常快。这是和系统读取数据的方式有关的,并不是因为某个函数...
c语言中fread函数问题
又不是二进制格式,要输出二进制形式,要自己写算法.另外,这个程序有一些严重的错误,修改如下:include "stdio.h"include <conio.h>\/*用到了getch()函数*\/ void main(){ int f;FILE *fp;fp=fopen("D:\\\\1","rb");fread(&f,1,sizeof(int),fp);printf("%d",fp);getch();} ...