C语言文件操作之fread函数详解
目录
- 前言
- 一、fread 函数
- 二、缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 )
- 三、处理乱码问题
- 四、记录读取的字节个数
- 五、读取到 0 字节的情况
- 六、读取完毕的情况
- 七、读取文本文件 “\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 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
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 10 10 字节 , 但是字符串必须要以 ‘\0’ 进行结尾 , 如果没有 ‘\0’ 则会一直读取直到出现 ‘\0’ 字符串结尾位置 ;
文章图片
三、处理乱码问题 为了避免上述打印出现乱码的情况 ,
char buffer[4] = {0};
准备了 4 4 4 字节缓冲区 , 每次只使用其中的 3 3 3 个字节 , 这就能保证最后一个字节必定是 ‘\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 4 4 字节 , 文件中只有 3 3 3 字节数据 , 则使用 fread 函数读取文件 , 缓冲区设置 1KB , 则实际读取到的基本单元个数是 0 0 0 ;
代码示例 :
#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; }
执行结果 :
文章图片
六、读取完毕的情况 【C语言文件操作之fread函数详解】如果文件已经读取完毕 , 不关闭文件 , 再次调用 fread 函数继续读取 , 则读取到的 基本单元 个数是 0 0 0 ;
使用
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 2 2 个索引读取出来的值是 0xd 对应 ‘\r’ , 第 3 3 3 个值是 0xa 对应 ‘\n’ ;
注意 : 最后两个字节是空行对应的 “\r\n” ;
fread : buffer = abcd , read count = 8buffer[0] = 61buffer[1] = 62buffer[2] = dbuffer[3] = abuffer[4] = 63buffer[5] = 64buffer[6] = dbuffer[7] = aMain 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 2 2 个索引读取出来的值是 0xa 对应 ‘\n’ ;
最后的空行只有一个 ‘\n’ ;
fread : buffer = abcd , read count = 6buffer[0] = 61buffer[1] = 62buffer[2] = abuffer[3] = 63buffer[4] = 64buffer[5] = aMain End
文章图片
总结 到此这篇关于C语言文件操作之fread函数的文章就介绍到这了,更多相关C语言文件操作fread函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 一起来了解c语言的str函数
- C语言中的文件操作详解
- Day|Day 61 # 《说话的力量》之三字诀窍,让语言从软弱无力变为铿锵有力(2018年10月15日)
- 一款可以一键基于博客markdown文件生成关键词云图的工具,支持一键上传图片
- Git|Git 中的回退操作(reset 和 revert)
- C语言学习|C Primer Plus,C语言精华,截图+代码+学习笔记【10000字】【原创】
- 语言篇(一)(来,回答一个问题)
- C语言从0到1|【C语言】字符串函数
- golang操作clickhouse使用入门
- 【正点原子Linux连载】第三章深入探究文件I/O-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1