
C 库函数 - fread()详解
头文件
发布日期:2021-05-14 10:08:30
浏览次数:22
分类:精选文章
本文共 2177 字,大约阅读时间需要 7 分钟。
头文件 stdio.h
描述
C 库函数 `fread` 用于从指定的输入流中读取数据到内存缓冲区。支持在内存中分块读取文件数据,适用于处理大文件或分块传输的情况。
声明
函数 `fread` 的具体声明如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
函数接受以下参数:
- ptr : 指向一个足够大的内存块,该块的大小必须至少为 `size * nmemb` 字节。
- size : 要读取的每个数据块的字节大小(以字节为单位)。
- nmemb : 要读取的数据块的数量。注意:如果 `size * nmemb` 超过了可用的内存,则函数可能会返回小于 `nmemb` 的值。
- stream : 指向 FILE 对象,该对象表示一个输入流文件。
返回值
函数返回以下值中的一种:
- 返回值等于 `nmemb` 说明成功读取了所有指定数据。
- 返回值小于 `nmemb` 说明已经读取到了文件末尾,无法读取更多数据。
- 返回值为 0 说明成功读取了零个数据项,但仍有数据可读。
- 返回值为 -1 说明发生错误,可能是因为文件未正确打开或读取操作失败。
说明
以下是 `fread` 函数的使用示例:
int nRead = fread(buf, sizeof(char), size, f);
或者
int nRead = fread(buf, sizeof(char) * size, 1, f);
两种写法均可适用,前者通过计算 `sizeof(char) * size` 来指定每次读取的字节数,后者则直接指定字节数量 `size`。
实例
下面的示例演示了如何使用 `fread` 函数读取文件内容:
#include #include int main() {FILE *fp;char buffer[20];// 打开文件用于读写fp = fopen("file.txt", "w+");// 写入一行内容fwrite("This is runoob", strlen("This is runoob") + 1, 1, fp);// 调整文件位置回到开头fseek(fp, 0, SEEK_SET);// 读取并显示内容fread(buffer, strlen("This is runoob") + 1, 1, fp);printf("%s\n", buffer);fclose(fp);return 0;}
运行该程序会创建文件 `file.txt` 并写入内容 `This is runoob`。随后函数 `fread` 会从文件的开头读取相同内容到 `buffer` 缓冲区中。
另一个示例
读取图片文件并存储到新文件:
#include #include void WriteFromStream(char * buf, char * filename, unsigned int size) {FILE * f = fopen(filename, "wb+");if (f) {fwrite(buf, 1, size, f);fclose(f);}} void ReadToStream(char * filename) {char new_file[30] = "";FILE * f = fopen(filename, "rb");if (f) {// 获取文件大小fseek(f, 0, SEEK_END);unsigned int size = ftell(f);char * buf = new char[size];fseek(f, 0, SEEK_SET);memset(buf, 0, size);unsigned int nRead = fread(buf, 1, size, f); // 打印读取到的二进制数据 if (nRead > 0) { for (unsigned int i = 0; i < nRead; i++) { printf("%02X ", (unsigned char)buf[i]); if (i % 16 == 15) { printf("\n"); } } } // 将二进制数据写入新文件 sprintf(new_file, "new3_%s", filename); WriteFromStream(buf, new_file, size); delete buf; } fclose(f); return; } int main() {ReadToStream("03.jpg");return 0;}
上述程序首先读取文件 `03.jpg` 的内容并存储到缓冲区 `buf`,然后将其以二进制格式写入新文件 `new3_03.jpg`。
发表评论
最新留言
很好
[***.229.124.182]2025年04月07日 08时18分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(1.23-1.29)
2019-03-06
83. Remove Duplicates from Sorted List
2019-03-06
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
2019-03-06
【Flink】Flink 底层RPC框架分析
2019-03-06
MySQL错误日志(Error Log)
2019-03-06
C++高精度模板
2019-03-06
解决:angularjs radio默认选中失效问题
2019-03-06
windows环境下安装zookeeper(仅本地使用)
2019-03-06
缓冲区溢出实例(一)--Windows
2019-03-06
PHP一句话木马小总结与SQL语句写一句话木马
2019-03-06
Python中字符串前添加r ,b, u, f前缀的含义
2019-03-06
Hadoop学习笔记—Yarn
2019-03-06
JSONPath小试牛刀之Snack3
2019-03-06
Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
2019-03-06
wxWidgets源码分析(3) - 消息映射表
2019-03-06
wxWidgets源码分析(5) - 窗口管理
2019-03-06
wxWidgets源码分析(7) - 窗口尺寸
2019-03-06
wxWidgets源码分析(8) - MVC架构
2019-03-06