服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C/C++详解如何实现文件备份

C/C++详解如何实现文件备份

2022-12-21 14:53非池不吃鱼 C/C++

这篇文章主要介绍了C/C++详解如何实现文件备份,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

编写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语言换个输出方式就可以了.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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;
}

正确的运行结果:

C/C++详解如何实现文件备份

  e m m . . . . . . emm... ... emm...... 作为小天才的我, 直接开润:

?
1
2
3
4
5
6
7
8
9
10
#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: 虽然我很想补充代码解释, 但是都是凑出来的… …

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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 Erron\n");
        exit(1);
    }
    //创建目标文件
    if ((fq = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR)) == -1) {
        printf("Open writefile Error\n");
        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;
}

C/C++详解如何实现文件备份

好了作业也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++文件备份内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/EX_fish/article/details/125117154

延伸 · 阅读

精彩推荐
  • C/C++C++实现一维向量旋转算法

    C++实现一维向量旋转算法

    这篇文章主要介绍了C++实现一维向量旋转算法,非常实用的经典算法,需要的朋友可以参考下...

    C++教程网9952021-01-27
  • C/C++C语言数据结构之算法的时间复杂度

    C语言数据结构之算法的时间复杂度

    这篇文章主要介绍了C语言数据结构之算法的时间复杂度,文章基于c语言的相关资料展开详细介绍,具有一定的参价值,需要的小伙伴可以参考一下...

    hqx7352022-11-21
  • C/C++OpenCV霍夫变换(Hough Transform)直线检测详解

    OpenCV霍夫变换(Hough Transform)直线检测详解

    这篇文章主要为大家详细介绍了OpenCV霍夫变换直线检测的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Joy_Shen7012021-07-16
  • C/C++OpenGL扫描线填充算法详解

    OpenGL扫描线填充算法详解

    这篇文章主要为大家详细介绍了OpenGL实现扫描线填充算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Frank(Zhiyang-Dou)7922021-08-17
  • C/C++C++实现优酷土豆去视频广告的方法

    C++实现优酷土豆去视频广告的方法

    这篇文章主要介绍了C++实现优酷土豆去视频广告的方法,实例分析了C++实现屏蔽功能的相关技巧,需要的朋友可以参考下...

    C++教程网9272021-02-25
  • C/C++C语言的随机数rand()函数详解

    C语言的随机数rand()函数详解

    这篇文章主要为大家详细介绍了C语言的随机数rand()函数,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    嵌入式@hxydj3642022-09-27
  • C/C++c语言读取obj文件转换数据的小例子

    c语言读取obj文件转换数据的小例子

    c语言读取obj文件转换数据的小例子,需要的朋友可以参考一下...

    C语言教程网3812020-11-18
  • C/C++C语言中字符型数据和浮点型数据介绍

    C语言中字符型数据和浮点型数据介绍

    大家好,本篇文章主要讲的是C语言中字符型数据和浮点型数据介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    康贤6352022-08-11