侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

fread函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 40 阅读 / 502 字 / 正在检测是否收录...

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);
}
0

评论区