C语言:文件操作( fread 函数 )

您所在的位置:网站首页 c语言文件操作rb C语言:文件操作( fread 函数 )

C语言:文件操作( fread 函数 )

2024-07-12 12:46:13| 来源: 网络整理| 查看: 265

一、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 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;

size_t count 参数 : 读取的 基本单元 个数 ;

FILE *stream 参数 : 文件指针 ;

size_t 返回值 : 实际从文件中读取的 基本单元 个数 ; 读取的字节数是 基本单元数 * 基本单元字节大小 ;

代码示例 : 一次性读满整个缓冲区 ;

#include 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"); return 0; }

执行结果 :

二、缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 )

假设缓冲区很小 , 文件很大 , 则需要循环读取文件数据 ;

使用 feof(p) 判定文件是否读取完毕 , 如果返回 true 说明文件没有读取完毕 , 返回 false , 说明文件读取完毕 ;

代码示例 :

#include int main() { // 使用 "rb" 读取二进制方式打开文件 FILE *p = fopen("D:\\a.txt", "rb"); // 用于接收读取数据的缓冲区 char buffer[4] = {0}; while(!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"); return 0; }

执行结果 : 读取之后出现乱码 , 这是由于每次读取10 字节 , 但是字符串必须要以‘\0’进行结尾 , 如果没有‘\0’则会一直读取直到出现‘\0’字符串结尾位置 ;

三、处理乱码问题

为了避免上述打印出现乱码的情况 , char buffer[4] = {0}; 准备了 4 44 字节缓冲区 , 每次只使用其中的 3 33 个字节 , 这就能保证最后一个字节必定是 ‘\0’ , 打印时就不会出现乱码 ;

代码示例 :

#include int main() { // 使用 "rb" 读取二进制方式打开文件 FILE *p = fopen("D:\\a.txt", "rb"); // 用于接收读取数据的缓冲区 char buffer[4] = {0}; while(!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"); return 0; }

执行结果 : 每次从文件中读取 缓冲区字节数 - 1 个字节 , 则能完整的将文本打印出来 ;

四、记录读取的字节个数

fread 函数返回值表示读取到的 基本单元 的个数 , 如果设置了 1KB 的缓冲区 , 但是文件中只有 5 字节 , 则 fread 的返回值就是实际读取到的数据个数 ;

代码示例 :

#include 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 , read count = %u\n", buffer, count); printf("Main End\n"); return 0; }

执行结果:

五、读取到 0 字节的情况

如果 基本单元 大小 4 44 字节 , 文件中只有 3 33 字节数据 , 则使用 fread 函数读取文件 , 缓冲区设置 1KB , 则实际读取到的基本单元个数是 0 00 ;

代码示例 :

#include 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 , read count = %u\n", buffer, count); printf("Main End\n"); return 0; }

执行结果 :

六、读取完毕的情况

如果文件已经读取完毕 , 不关闭文件 , 再次调用 fread 函数继续读取 , 则读取到的 基本单元 个数是 0 00 ;

使用 feof(p) 判定文件是否读取完毕 , 如果返回 true 说明文件没有读取完毕 , 返回 false , 说明文件读取完毕 ;

代码示例:

#include 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 , read count = %u\n", buffer, count); printf("Main End\n"); return 0; }

执行结果:

七、读取文本文件 “\n” 与 读取二进制文件 “\r\n” 区别

以下区别只在 Windows 系统存在 , 在 Linux / Unix 中读取文本数据与二进制数据没有区别 ;

使用 ‘rb’ 方式打开文件 , 读取二进制文件 , 然后调用 fread 函数读取文件 ,

#include 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 < count; i ++){ printf("buffer[%d] = %x\n", i, buffer[i]); } printf("Main End\n"); return 0; }

执行结果 : 第 2 22 个索引读取出来的值是 0xd 对应 ‘\r’ , 第 3 33 个值是 0xa 对应 ‘\n’ ;

注意 : 最后两个字节是空行对应的 “\r\n” ;

fread : buffer = ab cd , read count = 8 buffer[0] = 61 buffer[1] = 62 buffer[2] = d buffer[3] = a buffer[4] = 63 buffer[5] = 64 buffer[6] = d buffer[7] = a Main End

使用 ‘r’ 方式打开文件 , 读取文本文件 , 然后调用 fread 函数读取文件 ,

#include 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 < count; i ++){ printf("buffer[%d] = %x\n", i, buffer[i]); } printf("Main End\n"); return 0; }

执行结果 : 第 2 22 个索引读取出来的值是 0xa 对应 ‘\n’ ;

最后的空行只有一个 ‘\n’ ;

fread : buffer = ab cd , read count = 6 buffer[0] = 61 buffer[1] = 62 buffer[2] = a buffer[3] = 63 buffer[4] = 64 buffer[5] = a Main End



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭