日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C/C++詳解如何實現文件備份_C 語言

作者:非池不吃魚 ? 更新時間: 2022-08-02 編程語言

編寫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 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;
}

好了作業也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?? ?文件的末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

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

欄目分類
最近更新