编写c程序,模拟实现linux文件系统的简单i/o流操作:备份文件,将源文件source.dat备份为target.dat文件。要求:
(1)使用c库函数实现文件备份
(2)使用系统调用函数实现文件备份
这个实验的步骤就是: 双击打开需要备份的文件, 然后选择全部并且复制. 接着建立并且打开目的文件, 粘贴即可. 简单好抄.
上面是题外话… 接下来我们进入正题 = > c => {c} =>c 语言中包含了能够进行文件备份的一系列内置函数, 例如: f o p e n ( ) , f c l o s e ( ) , f r e a d ( ) , f w r i t e ( ) , f s e e k ( ) fopen(), fclose(), fread(), fwrite(), fseek() fopen(),fclose(),fread(),fwrite(),fseek() 等. 正让我们进行文件拷贝(文件中的内容复制)变得十分的容易. 但是在系统调用下就并不这么简单了(虽然基本语法一致, 但是语法难记).
一、c语言库的实现方法:
在习惯一系列 c c c语言的文件操作内置函数后, 我们可以很轻松的写出下面的代码:
直接编译运行就行, 但是你需要保证有 s o u r c e source source文件
p s : ps: ps: 习惯书写 c c c ++, 改写c语言换个输出方式就可以了.
#include<bits/stdc++.h> #define ios ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); using namespace std; signed main(void){ios; //c ++ 的关流, 不用管 file *fp, *fq; //建立文件的索引指针 if((fp = fopen("source" , "ra"))){ //打开需备份文件, 并且得到文件索引指针头 cout << "success in readfile open!" << endl; }else{ cout << "can't open readfile!" << endl; exit(1); } if((fq = fopen("target" , "wa"))){ //建立(打开)目标文件, 并且得到文件索引指针头 cout << "success in writefile open!" << endl; }else { cout << "can't open writefile!" << endl; exit(1); } char buffer[20]; //设置一个缓冲区. while(fread(buffer, sizeof(char), 20, fp)){ //在需备份中一直获取内容 fwrite(buffer, sizeof(char), 20, fq); //获取内容后一直同步输入目标文件 } if(!fclose(fp)){ //关闭成功的返回值为0 cout << "success in readfile close!" << endl; }else { cout << "can't close readfile!" << endl; exit(1); } if(!fclose(fq)){ cout << "success in writefile close!" << endl; }else { cout << "can't close writefile!" << endl; exit(1); } return 0; }
正确的运行结果:
e m m . . . . . . emm… … emm…… 作为小天才的我, 直接开润:
#include<bits/stdc++.h> #define ios ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); using namespace std; signed main(void){ios; //c ++ 的关流, 不用管 freopen("source" , "r" , stdin); freopen("target" , "w" , stdout); char c; while((c = getchar()) != eof) putchar(c); return 0; }
二、系统调用函数:
在查阅了相关资料后, 还是写了一份属于自己的作业. 代码如下(已经运行过, 有效.
需要先编译, 再在运行执行文件的同时加上调用的文件名, 具体实现步骤代码下方会演示.
p s : ps: ps: 虽然我很想补充代码解释, 但是都是凑出来的… …
#include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> signed main(int argc, char **argv) { int fp, fq; //源文件的文件描述符, 目标文件的文件描述符 char buffer[20]; int nread; //判断参数个数是否正确 if (argc != 3) { printf("error~"); exit(1); } //打开源文件 if ((fp = open(argv[1], o_rdonly)) == -1) { printf("open readfile erronn"); exit(1); } //创建目标文件 if ((fq = open(argv[2], o_creat | o_wronly | o_trunc, s_irusr | s_iwusr)) == -1) { printf("open writefile errorn"); exit(1); } //进行文件拷贝 while ((nread = read(fp, buffer, 20)) > 0) { if ((write(fq, buffer, nread)) != nread) //将buffer中的数据写到目的文件 printf("write error"); } close(fp); close(fq); return 0; }
好了作业也chao完了, 下面来对 c c c语言内置函数进行一些补充:
fopen(const char *filename, const char *mode)
//第一个参数表示打开的文件, 第二个参数表示给予的权限
表 文件操作类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含义
────────────────────────────────────────────────
"r" 打开文字文件只读
"w" 创建文字文件只写
"a" 增补, 如果文件不存在则创建一个
"r+" 打开一个文字文件读/写
"w+" 创建一个文字文件读/写
"a+" 打开或创建一个文件增补
"b" 二进制文件(可以和上面每一项合用)
"t" 文这文件(默认项)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━fread(void *ptr, size_t size, size_t nmemb, file *stream)
//第一个参数表示缓冲区(指针)
//第二个参数表示读取的每个元素的大小
//第三个参数表示元素的个数 (实际上第二个参数和第三个参数表示的总和就是缓冲区的大小
//第四个参数是对象的指针, 用来标记位置fwrite(const void *ptr, size_t size, size_t nmemb, file *stream)
//第一个参数表示写入的内容
//后三个参数和fread一致fclose(file *stream) //关闭成功的返回值是0
//参数是指针对象fseek(file *stream, long int offset, int whence)
//第一个参数为指针对象, 就是要作用的指针
//第二个表示在第三个参数上的偏移量
//第三个参数索引位置
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含义
────────────────────────────────────────────────
seek_set 文件的开头
seek_cur 文件指针的当前位置
seek_end 文件的末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
到此这篇关于c/c++详解如何实现文件备份的文章就介绍到这了,更多相关c++文件备份内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!
需要了解更多c/c++开发分享C/C++详解如何实现文件备份,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/1238042.html