fread函数用法详解
fread函数简介
- 头文件包含
#include <stdio.h>
- 函数定义
size_t fread(void * ptr , size_t size , size_t nmemb \
size_t fwrite(const void * ptr , size_t size , size_t nmemb ,
FILE * stream );
fread函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘fread’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <stdio.h>
fread函数详细描述
函数fread ()从stream 指向的流中读取nmemb项数据,每个size字节长,将它们存储在ptr 指定的位置
函数fwrite ()将nmemb的数据项(每个size字节长)写到stream 指向的流中,从ptr 给定的位置获取这些数据项
有关非锁定对应项,请参见unlocked_stdio (3)
fread函数返回值
成功后,fread ()和fwrite ()返回读取或写入的项目数。这个数字等于仅当size为1时传输的字节数。如果发生错误,或者到达文件末尾,则返回值为短项计数(或零)。
流的文件位置指示符按成功读取或写入的字节数前进。
fread ()不区分文件结束和错误,调用方必须使用feof (3)和ferror (3)来确定哪个发生了。
fread函数使用举例
下面的程序通过在二进制模式下解析/bin/sh ELF可执行文件并打印其魔术和类来演示fread ()的使用:
$ \fB./a.out\fP
ELF magic: 0x7f454c46
Class: 0x02
Program source&
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int
main(void)
{
FILE *fp = fopen("/bin/sh", "rb");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
unsigned char buffer[4];
size_t ret = fread(buffer, ARRAY_SIZE(buffer), sizeof(*buffer), fp);
if (ret != sizeof(*buffer)) {
fprintf(stderr, "fread() failed: %zu\en", ret);
exit(EXIT_FAILURE);
}
printf("ELF magic: %#04x%02x%02x%02x\en", buffer[0], buffer[1],
buffer[2], buffer[3]);
ret = fread(buffer, 1, 1, fp);
if (ret != 1) {
fprintf(stderr, "fread() failed: %zu\en", ret);
exit(EXIT_FAILURE);
}
printf("Class: %#04x\en", buffer[0]);
fclose(fp);
exit(EXIT_SUCCESS);
}
评论区