头文件 stdio.h 描述

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;

}