linux下fread(),fwrite(),fseek(),ftell(),rewind(),fflush()函数使用说明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、fread()函数

fread 函数作用 : 从文件中读取若干字节数据到内存缓冲区中

//fread 函数原型 :
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
void *buffer 参数 : 将文件中的二进制数据读取到该缓冲区中 

size_t size 参数 : 读取的 基本单元字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小 ;
如果 buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
如果 buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
size_t count 参数 : 读取的基本单元个数 ;
FILE *stream 参数 : 文件指针 ;
size_t 返回值 : 实际从文件中读取的基本单元个数 ;
读取的字节数是 基本单元数 * 基本单元字节大小 ;

fread返回值解释

  fread(buffer, 1, 1024, p);
  该函数表示一个从文件p中读取一个字节,读取1024次,
  读取完成之后函数返回值为函数从文件p中读取到真正的字节数
  比如文件中只有10个字节,则函数返回值为10,没有字节则返回0;
  fread可以循环调用,函数会自动调整在文件中的指针位置,
  从而能够读取文件中所有内容

二、 fwrite()函数

write函数
功能:是用于写入二进制数据

size_t fwrite(void*buffer,size_ size,size_t count,FILE*stream)

1.buffer:是一个指向用于保存数据的内存位置的指针
(是一个指针,对于fwrite来说,是要获取数据的地址)
2.size: 是每次读取的字节数
3.count: 是读取的次数
4.stream: 是数据写入的流(目标指针的文件)
返回值:是实际写入的元素(并非字节)数目
ps:如果输入过程中遇到了文件尾或者输出过程中出现了失误,这个数字可能比请求的元素数目要小

fread()与fwrite()代码示例 :

实现功能:copy一个文件内容到另一个文件

注意:我们在传递size大小的时候最好传递单字节,等价于fgetc();这样可以防止传递size过大,而文件中字节太小,从而操作读取不到文件字节。
代码如下

#include <stdio.h>
#include <stdlib.h>
#include<errno.h>

int main(int argc ,char ** argv)//命令行传参 第一个参数表示命令行传递参数个数 第二个参数保存命令行传递的参数
{
  int n;
  FILE *pr=NULL;
  FILE *ps=NULL;
  char buffer[1024];
  pr = fopen(argv[1],"r");//只读格式打开temp文件,无文件则报错
  ps = fopen(argv[2],"w");//打开test文件只写,无文件则创建
  if(pr==NULL)//打开 文件失败
  {
    perror("fopen()");
    exit(1);
  }
  while((n=fread(buffer,1,1024,pr))>0)//一次从文件中读一个字节 读取1024次 并存入buffer数组中
    //每次从pr文件读到的字节数存到n中
      //当文件内容被读完时,再次调用fread会导致读不到内容,返回值为0
  {
    fwrite(buffer,1,n,ps);//每次从buffer数组中一次读取一个字节,读取n次,读取n个字节存入ps文件中
  }
  fclose(ps);//关闭所打开的两个文件
  fclose(pr);
  exit(0);
}

在这里插入图片描述
文件copy成功

三、fseek()函数

 fseek() 函数:调节文件指针位置

应用场景:当我们使用文件指针通过fwrite()函数向文件中输入数据,假设数据为字符串“麻辣香锅”,输入完毕后文件指针的指向位置实际上是“锅”的后面,相当于光标。此刻如果使用fread函数是无法正常读取文件内容的,原因是fread只能读取指针往后的内容。需要将文件指针前置,这时候就需要用到fseek函数。

int fseek(FILE *stream, long int offset, int whence)
参数
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量	描述
SEEK_SET	文件的开头
SEEK_CUR	文件指针的当前位置
SEEK_END	文件的末尾
返回值
如果成功,则该函数返回零,否则返回非零值。

比如我们向文件中某位置输入了10个字节的内容,我们如果想立即读取这10个字节的内容我们就可以调用fseek函数(),代码如下

fseek(file,-10SEEK_CUR;

四、ftell()函数

ftell() 函数的作用是 获取文件的当前指针位置相对于文件首地址的 偏移字节数,即获取文件中的当前指针位置 ;

ftell 函数原型 :
#include <stdio.h>
long ftell(FILE *stream);

ftell 使用场景 : 随机方式存取文件时 , 使用 fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell 函数确定指针位置 ;

五、rewind()函数

rewind()函数作用:将文件指针设置在流的开头。在需要多次使用流时,这就很有用。
ewind()函数的语法:

void rewind(FILE *stream)
rewind()函数等价于fseek(file,0SEEK_SET)函数

示例:

创建一个源文件:rewind-file.c,其代码如下所示 - 
#include<stdio.h>   
void main() {
    FILE *fp;
    char c;

    fp = fopen("string-file.txt", "r");
    while ((c = fgetc(fp)) != EOF) {
        printf("%c", c);
    }

    rewind(fp); // moves the file pointer at beginning of the file  
    // 不用重新打开文件,直接从头读取内容
    while ((c = fgetc(fp)) != EOF) {
        printf("%c", c);
    }

    fclose(fp);

}

六、fflush()函数

fflush()函数:更新缓存区,或者说强行刷新缓冲区

头文件:#include<stdio.h>
函数定义:int fflush(FILE *stream);

函数说明:调用fflush()会将缓冲区中的内容写到stream所指的文件中去.若stream为NULL,则会将所有打开的文件进行数据更新。
fflush(stdin):刷新缓冲区,将缓冲区内的数据清空并丢弃。
fflush(stdout):刷新缓冲区,将缓冲区内的数据输出到设备。

缓冲区作用

三种缓冲区详细解释链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学习~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值