函数的作用是:从指定的文件中读取块数据。下面文章主要介绍C语言文件操作的fread函数的相关信息。通过示例代码详细介绍,有需要的朋友可以参考一下。
目录
前言1、fread函数2、缓冲区限制(循环读取文件| feof函数确定文件读取完毕)3、处理乱码问题4、记录读取的字节数5、读取0字节6、读取完毕7、总结读取文本文件“\n”和读取二进制文件“\r\n”的区别
前言
二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;
Fread/fwrite函数既可以操作二进制文件,也可以操作文本文件;
Getc/putc函数、fscanf/fprintf函数、fgets/fgets函数只能用来操作文本文件;
一、fread 函数
fread 函数作用 :从文件中读取几个字节的数据到内存缓冲区;
fread 函数原型 :
size_t fread( void *buffer,size_t size,size_t count,FILE * stream);
void *buffer 参数 :将文件中的二进制数据读入这个缓冲区;
size_t size 参数 :读取基本单位字节大小,单位是字节,一般是buffer缓冲区的单位大小;
如果buffer缓冲区是一个char数组,这个参数的值是sizeof(char);如果buffer buffer是一个int数组,那么这个参数的值就是sizeof(int);
size_t count 参数 :基本单位数读取;
FILE *stream 参数 :文件指针;
size_t 返回值 :从文件中实际读取的基本单位数;读取的字节数是基本单元数*基本单元字节大小;
代码示例 :一次性读取整个缓冲区;
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
fread(buffer,sizeof(char),sizeof(buffer),p);
//打印读取的内容
printf('buffer=%s\n ',buffer);
printf(' Main End \ n ');
返回0;
}
执行结果:
二、缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 )
假设缓冲区小,文件大,需要循环读取文件数据;
使用feof(p)确定文件是否已被读取;如果返回true,说明文件没有被读取;如果返回false,则表示文件已被读取;
代码示例 :
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[4]={ 0 };
而(!feof(p)){
memset(buffer,0,sizeof(buffer))。
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
fread(buffer,sizeof(char),sizeof(buffer),p);
//打印读取的内容
printf('buffer=%s\n ',buffer);
}
printf(' Main End \ n ');
返回0;
}
执行结果 :看完乱码。这是因为每次读取10 ^ 10 ^ 10字节,但字符串必须以' \ 0 '结尾。如果没有' \ 0 ',您将一直读到' \ 0 '字符串的结尾出现。
三、处理乱码问题
为了避免乱码打印,char buffer[4]={ 0 };准备了一个4 ^ 4的4字节缓冲区,每次只用3 ^ 3 ^ 3字节,可以保证最后一个字节一定是' \ 0 ',打印时不会出现乱码;
代码示例:
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[4]={ 0 };
而(!feof(p)){
memset(buffer,0,sizeof(buffer))。
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
fread(buffer,sizeof(char),sizeof(buffer) - 1,p);
//打印读取的内容
printf('buffer=%s\n ',buffer);
}
printf(' Main End \ n ');
返回0;
}
执行:每次从文件中读取缓冲区的字节数-1字节,就可以完整地打印出文本;
四、记录读取的字节个数
fread函数的返回值表示读取的基本单位数。如果设置了1KB的缓冲区,但文件中只有5个字节,则fread的返回值是实际读取的数据数。
代码示例:
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
//返回值:fread函数的返回值表示读取的基本单位数。
size_t count=fread(buffer,sizeof(char),sizeof(buffer) - 1,p);
//打印读取的内容
printf('buffer=%s,读取计数=%u\n ',buffer,count);
printf(' Main End \ n ');
返回0;
}
执行结果:
五、读取到 0 字节的情况
如果基本单元大小为4 ^ 4 ^ 4字节,文件中只有3 ^ 3 ^ 3字节的数据,那么使用fread函数读取文件,缓冲区设置为1KB,那么实际读取的基本单元数为0 ^ 0 ^ 0;
代码示例:
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
//返回值:fread函数的返回值表示读取的基本单位数。
size_t count=fread(buffer,sizeof(int),sizeof(buffer) - 1,p);
//打印读取的内容
printf('buffer=%s,读取计数=%u\n ',buffer,count);
printf(' Main End \ n ');
返回0;
}
执行结果:
六、读取完毕的情况
如果文件已经读取,文件没有关闭,再次调用fread函数继续读取,那么读取的基本单元数为0 0 0;
使用feof(p)确定文件是否已被读取;如果返回true,说明文件没有被读取;如果返回false,则表示文件已被读取;
代码示例:
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
//返回值:fread函数的返回值表示读取的基本单位数。
size_t count=fread(buffer,sizeof(char),sizeof(buffer) - 1,p);
//打印第一次读取的内容
printf('First fread : buffer=%s,read count=%u\n ',buffer,count);
count=fread(buffer,sizeof(int),sizeof(buffer) - 1,p);
//打印第二次读取的内容
printf('Second fread : buffer=%s,读取计数=%u\n ',buffer,count);
printf(' Main End \ n ');
返回0;
}
执行结果:
七、读取文本文件 “\n” 与 读取二进制文件 “\r\n” 区别
以下区别只在 Windows 系统存在 , 在 Linux / Unix 中读取文本数据与二进制数据没有区别 ;
使用‘Rb’模式打开文件,读取二进制文件,然后调用fread函数读取文件,
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' Rb ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
//返回值:fread函数的返回值表示读取的基本单位数。
size_t count=fread(buffer,sizeof(char),sizeof(buffer) - 1,p);
//打印第一次读取的内容
printf('fread : buffer=%s,read count=%u\n ',buffer,count);
//逐字节打印读取数据的ASCII码
int I=0;
for(I=0;我数;i ){
printf('buffer[%d]=%x\n ',I,buffer[I]);
}
printf(' Main End \ n ');
返回0;
}
结果:从第222个索引读取的值是0xd对应' \ r ',第333个值是0xa对应' \ n ';
注意:最后两个字节为“\r\n”对应空行;
fread : buffer=ab
激光唱片
,读取计数=8
缓冲区[0]=61
缓冲区[1]=62
缓冲区[2]=d
缓冲器[3]=a
缓冲区[4]=63
缓冲区[5]=64
缓冲区[6]=d
缓冲器[7]=a
主要端
用‘R’模式打开文件,读取文本文件,然后调用fread函数读取文件,
#包含stdio.h
int main()
{
//使用“rb”读取二进制文件以打开文件
FILE *p=fopen('D:\\a.txt ',' r ');
//接收读取数据的缓冲区
char buffer[1024]={ 0 };
//buffer:文件读入内存的位置
//sizeof(char):读取基本单元的字节长度。
//sizeof(buffer):读取的基本单位数,
//读取的字节数是sizeof(buffer) * sizeof(char)
//p:文件指针
//返回值:fread函数的返回值表示读取的基本单位数。
size_t count=fread(buffer,sizeof(char),sizeof(buffer) - 1,p);
//打印第一次读取的内容
printf('fread : buffer=%s,read count=%u\n ',buffer,count);
//逐字节打印读取数据的ASCII码
int I=0;
for(I=0;我数;i ){
printf('buffer[%d]=%x\n ',I,buffer[I]);
}
printf(' Main End \ n ');
返回0;
}
结果:第222个索引读取的值是0xa对应的' \ n ';
最后一个空行只有一个' \ n ';
fread : buffer=ab
激光唱片
,读取计数=6
缓冲区[0]=61
缓冲区[1]=62
缓冲区[2]=a
缓冲区[3]=63
缓冲区[4]=64
缓冲器[5]=a
主要端
总结
关于C语言文件操作的fread函数的这篇文章到此为止。关于C语言文件操作的fread函数的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。