C语言I/0请利用dup2 + fgets + printf 实现文件拷贝功能

打印 上一主题 下一主题

主题 983|帖子 983|积分 2959

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.代码结果展示:

2.源码剖析:
(1)备份标准输出流:利用 dup 备份标准输出流。
(2)打开文件:利用 fopen 打开源文件,利用 open 打开目标文件。
(3)重定向文件形貌符:利用 dup2 将目标文件的文件形貌符重定向到标准输出。
(4)读取和写入数据:利用 fgets 从源文件读取数据,利用 printf 将数据写入目标文件。
(5)关闭文件:关闭文件并规复标准输出流。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. int main(int argc, const char *argv[]) {
  6.     int STDOUT = dup(1); // 备份标准输出流
  7.     char *ch = "book";         // 文件名 被复制的文件
  8.     char *ch_bak = "book_bak"; // 文件名 复制到该文件
  9.     FILE *rfp = fopen(ch, "r");
  10.     if (rfp == NULL) {
  11.         perror("tips: 文件 book 打开失败\n");
  12.         return 1;
  13.     }
  14.     int wfp = open(ch_bak, O_WRONLY | O_CREAT | O_TRUNC, 0644);
  15.     if (wfp == -1) {
  16.         perror("tips: 文件 book_bak 打开失败\n");
  17.         fclose(rfp);
  18.         return 1;
  19.     }
  20.     dup2(wfp, 1); // 重定向,将标准输出重定向到文件 book_bak
  21.     char buf[1024]; // 用于存放读取到的内容
  22.     while (fgets(buf, sizeof(buf), rfp) != NULL) {
  23.         printf("%s", buf); // 输出到重定向后的文件
  24.         fflush(stdout);    // 刷新,写入到文件
  25.     }
  26.     // 恢复标准输出流
  27.     dup2(STDOUT, 1);
  28.     close(STDOUT);
  29.     close(wfp);
  30.     fclose(rfp);
  31.     printf("tips: 文件复制完毕,于 %s 文件中查看效果\n", ch_bak);
  32.     return 0;
  33. }
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表