文件操作中fread和fwrite的介绍和使用,实现创建一个copy(复制任何文件)程序

一、前言

要实现一个copy的程序,得先明白每个文件在内存中是以二进制序列来储存的,恰好C语言提供给我们两个库函数,分别是 fread fwrite,这两个库函数是用来读写二进制文件中的内容,所以刚好可以提供给我们用来写这个copy程序。接下来,先给大家介绍这两个库函数的使用。

二、freadfwrite 的使用

1、fread 的使用

fread 故名思意就是读取 FILE * stream 文件的内容,然后写到 void * ptr 这个地址下面的内存中。

size_t  size 代表的是文件中每个内容的大小,单位是字节,在文件的二进制序列下,每个内容的大小都是一个字节,明白这个对后面使用它来做 copy 程序很有帮助。

size_t count 代表的是把 FILE * stream 中的多少个元素写到 void * ptr 的内存下。

fread 的返回值是一个 size_t 的类型,返回值代表的是从FILE * stream 写入到 void * ptr 内存下的元素个数

2、fwrite 的使用

fwrite 顾名思义就是把 const void * ptr 中的内容写到 FILE * stream 的文件中,我觉得有点和fread 的操作相反。

size_t  size 代表的就是 const void * ptr 内存下的每个元素的字节大小,单位是字节。

size_t  count 代表的就是把 const void * ptr 中多少个元素写到 FILE * stream 文件中,单位也是字节。

fwrite 的返回值也是一个 size_t 的类型,返回值代表的就是 const void * ptr 中写到 FILE * stream 文件中的元素个数。

三、实现copy程序

明白了上面两个库函数的使用方法,大家开始和我一起写这个程序吧!

1、我们先在 vs 下创建一个 test.c 的文件

2、选择一个自己需要复制的文件放到 test.c文件下,操作如下:

当然 每种文件都可以,包括图片,音频,视频...... 然后就可以用刚才学的两个库函数开始写程序了

具体操作方法就是把要复制的文件的内容用 fread 读取出来,放到一个地址的内存下面保存起来,然后再用 fwrite 把保存的地址下的内容写到需要 copy 的文件里面即可操作完成。

操作方法:

1、先打开需要复制的文件,然后再用fopen创建一个需要复制的文件,操作如下:

这里的buffer是一个地址,是用来接收用fread读取的内容,并且放到buffer地址下,之后再用fwritebuffer地址下的内容写到复制的文件里面即可完成文件的复制。

2、用buffer的地址和文件操作中的其他函数一起使用开辟空间

但是buffer只是一个地址,它应该先用malloc开辟内存大小,才可以存放需要复制的文件的内容,但是应该开辟多大的内存,请看下面操作:

不了解fseek,ftell,rewind 函数的同学们如果有需要请私信我或者评论区留言,我可以单独出一期博客告诉大家,今天在这先不做讲解了,重点在copy程序上。

3、读取需要复制的文件的内容,并且写进复制的文件中,操作如下:

运行之后会发现test.c文件下面程序已经帮我们copy好了我们需要复制的内容,结果如下:​​​​​​​

看到这块,我们的copy程序就已经完美的结束了,也不是很难,实操起来会发现很有意思,希望大家下去可以自己试试,如果发现那里不明白,可以私信我或者评论区留言,我来帮大家解答。

还有文件可能打开和之前的不一样,是因为复制的文件是文本类型,其实也很简单,因为咱们复制的是照片,在复制的文本文件后加个后缀即可观察了,例如照片后加一个 .PNG ,如果是视频那就是 .mp4 ,还有其它类型只要加上它的后缀即可查看。复制后结果如下:

结果:

好了 这个复制文件的程序就告诉大家了,看完操作后如果有什么不懂的地方请私信我或者评论区留言,我帮大家解决。

四、共勉

千里之行始于足下!!!在C语言的学习中还有许许多多的知识等着我们去学习,所以大家应该静下心来去学习,最后一定会成为下一个大佬!!!

  • 36
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用系统调用read和write实现文件复制C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int input_fd, output_fd; // 输入和输出文件描述符 ssize_t ret_in, ret_out; // 读取和写入字节数 char buffer[BUF_SIZE]; // 缓冲区 if(argc != 3){ printf("Usage: %s file_origin file_target\n", argv[0]); return 1; } // 打开输入文件,如果出错则输出错误信息并退出程序 input_fd = open(argv[1], O_RDONLY); if(input_fd == -1){ perror("open"); return 2; } // 打开输出文件,如果出错则输出错误信息并退出程序 output_fd = open(argv[2], O_WRONLY | O_CREAT, 0644); if(output_fd == -1){ perror("open"); return 3; } // 循环读取输入文件,并写入输出文件,直到读取完毕 while((ret_in = read(input_fd, buffer, BUF_SIZE)) > 0){ ret_out = write(output_fd, buffer, (ssize_t) ret_in); if(ret_out != ret_in){ // 如果写入字节数不等于读取字节数,则输出错误信息并退出程序 perror("write"); return 4; } } // 如果读取出错,则输出错误信息并退出程序 if(ret_in == -1){ perror("read"); return 5; } // 关闭文件描述符 close(input_fd); close(output_fd); return 0; } ``` 以下是使用文件的库函数freadfwrite实现文件复制C语言程序: ```c #include <stdio.h> #include <stdlib.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { FILE *input_fp, *output_fp; // 输入和输出文件指针 size_t ret; // 读取字节数 char buffer[BUF_SIZE]; // 缓冲区 if(argc != 3){ printf("Usage: %s file_origin file_target\n", argv[0]); return 1; } // 打开输入文件,如果出错则输出错误信息并退出程序 input_fp = fopen(argv[1], "rb"); if(input_fp == NULL){ perror("fopen"); return 2; } // 打开输出文件,如果出错则输出错误信息并退出程序 output_fp = fopen(argv[2], "wb"); if(output_fp == NULL){ perror("fopen"); return 3; } // 循环读取输入文件,并写入输出文件,直到读取完毕 while((ret = fread(buffer, 1, BUF_SIZE, input_fp)) > 0){ fwrite(buffer, 1, ret, output_fp); } // 如果读取出错,则输出错误信息并退出程序 if(ferror(input_fp)){ perror("fread"); return 4; } // 关闭文件指针 fclose(input_fp); fclose(output_fp); return 0; } ``` 使用time命令测试两个程序的执行时间: ``` $ time ./copy_readwrite input.txt output.txt real 0m0.002s user 0m0.001s sys 0m0.001s $ time ./copy_freadfwrite input.txt output.txt real 0m0.001s user 0m0.000s sys 0m0.001s ``` 可以看出,使用文件的库函数freadfwrite实现文件复制程序执行时间更短,效率更高。这是因为文件的库函数freadfwrite可以利用缓冲区,一次读取或写入多个字节,减少系统调用的次数,从而提高程序的效率。而使用系统调用read和write实现文件复制程序则没有利用缓冲区,每次仅读取或写入一个字节,需要进行多次系统调用,效率较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值