IT评测·应用市场-qidao123.com

标题: C语言I/0请利用dup2 + fgets + printf 实现文件拷贝功能 [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2025-1-26 09:14
标题: C语言I/0请利用dup2 + fgets + printf 实现文件拷贝功能
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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4