C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
声明下面是 fread() 函数的声明。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)参数
- ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
- size – 这是要读取的每个元素的大小,以字节为单位。
- nmemb – 这是元素的个数,每个元素的大小为 size 字节。
- stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值
- 成功读取的元素总数会以 size_t nmemb对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
int nRead = fread(buf, sizeof(char), size, f); int nRead = fread(buf, sizeof(char)*size, 1, f);
这两种写法都可以。
实例下面的实例演示了 fread() 函数的用法。
实例
#include <stdio.h> #include <string.h> int main() { FILE *fp; char c[] = "This is runoob"; char buffer[20]; /* 打开文件用于读写 */ fp = fopen("file.txt", "w+"); /* 写入数据到文件 */ fwrite(c, strlen(c) + 1, 1, fp); /* 查找文件的开头 */ fseek(fp, 0, SEEK_SET); /* 读取并显示数据 */ fread(buffer, strlen(c)+1, 1, fp); printf("%s\n", buffer); fclose(fp); return(0); }
让我们编译并运行上面的程序,这将创建一个文件 file.txt,然后写入内容 This is runoob。接下来我们使用 fseek() 函数来重置写指针到文件的开头,文件内容如下所示:
This is runoob另一个例子
将一张图片用二进制格式读取出来,然后传输,并存储在一个新文件
/********************************************************************* 概要:图片读取与存储测试 目的:将一张图片用二进制格式读取出来,然后传输,并存储在一个新文件 日期:2019.9.26 作者:maohuifei **********************************************************************/ #include<stdio.h> #include<string.h> /********************************************************************* * 摘 要:将缓冲区数据写入文件 * 参 数: buf: filename: size:长度 * 当前版本:1.0.0 * 作 者:maoge * 日 期:2019.09.07 * 备 注: **********************************************************************/ void WriteFromStream(char * buf, char * filename, unsigned int size) { FILE * f = fopen(filename, "wb+"); if (f) { fwrite(buf, 1, size, f); fclose(f); } } /********************************************************************* * 摘 要:读取文件到缓冲区 * 参 数: buf: filename: size: * 当前版本:1.0.0 * 作 者:maoge * 日 期:2019.09.07 * 备 注: **********************************************************************/ void ReadToStream(char * filename) { char new_file[30] = "";//文件名 FILE * f = fopen(filename, "rb"); if (f) { //下面 fseek(f, 0, SEEK_END); int size = ftell(f);//返回给定流stream的当前文件位置。一般作用是获取文件大小,以定义buf大小 char * buf = new char[size]; fseek(f, 0, SEEK_SET); memset(buf, 0, size);//赋初值0 int nRead = fread(buf, sizeof(char), size, f); printf("size=%d\n ", size); printf("nRead=%d\n ",nRead); //int nRead = fread(buf, 1, size, f);//sizeof(char)值就是1 fclose(f); if (nRead > 0) { //将二进制流打印成16进制字符串 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; } } int main() { ReadToStream("03.jpg"); return 0; }