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`。

上一篇:文件读取与写入操作——将一张图片用二进制格式读取出来,然后传输,并存储在一个新文件
下一篇:如何播放pcm文件

发表评论

最新留言

很好
[***.229.124.182]2025年04月07日 08时18分11秒