在上一次的代碼中,不管目標文件是否存在我們都會複製一遍,這就可能會破壞已有的文件
/*
本程序所實現的功能爲 【**.exe srcFile desFile】 ,就是將srcFile 拷貝一份到desfile,
所以在運行程序時必須在後面添加兩個參數,第一個是已經存在的文件的路徑,另一個是需要
複製到的路徑。
本程序主要是利用文件操作函數中的 fgetc() 函數 與 fputc() 函數。
函數說明:
fgetc(FILE *fp):
從流中讀取一個字符,同時沒取完一個字符fp 指針會自動指向下一個字符。
當讀取錯誤時會返回EOF。可以通過返回值判斷當前文件是否讀完。
fputc(char ch, FILE *fp):
向流中輸入一個字符,與fgetc 相似,在每寫入一個後fp 指向下一個,等待繼續輸入,或者
流關閉
在函數中我們還需要用到 fopen(char * fileName, char *type),第一個參數就是我們所需要的文件路徑,
第二個參數就是讀取的方式。讀取方式如下:
r:只讀方式打開一個文本,只允許讀數據
w:只寫打開或建立一個文本文件,只允許寫數據
a:追加打開一個文本文件,並在文件末尾寫數據
rb:只讀打開一個二進制文件,只讀
wb:只寫打開,或建立一個二進制文件,只允許寫數據
ab:追加打開一個二進制文件,並在文件末尾寫數據
r+:讀寫打開一個文本文件,允許寫和讀
w+:讀寫打開或建立一個文本文件,可以讀和寫
a+:讀寫打開一個文本文件,允許讀,或在文件末尾追加數據
rb+:讀寫打開一個二進制文件,允許讀和寫
wb+:讀寫打開或建立一個二進制文件,允許讀和寫
ab+:讀寫打開一個二進制文件,允許讀,或在文件末尾追加數據
還有第二個函數fclose(FILE *fp) ,也就是關閉文件流,這個很重要
後面添加:
函數原型: int access(const char *filename, int mode);
所屬頭文件:#include <io.h>
filename:可以填寫文件夾路徑或者文件路徑
mode: 0 (F_OK) 只判斷是否存在
2 (R_OK) 判斷寫入權限
4 (W_OK) 判斷讀取權限
6 (X_OK) 判斷執行權限
在這個程序中我們只使用用F_OK 文件是否存在
*/
#include<io.h>// 在這個頭文件中包含有檢測當前文件是否存在的函數access(const char *filename, int mode);
#include<stdio.h>// 在這個頭文件中包含了我們所需要的各個文件操作函數
int main(int argc, char* argv[])
{
FILE *srcFile , *desFile;//定義兩個文件指針
if(argc != 3)// 判斷參數輸入是否滿足要求
{
printf("Please input <%s srcFile desFile>",argv[0]);// 這個地方提示用戶程序執行的正確方式
return 0;
}
srcFile = fopen(argv[1],"rb");//以讀取二進制的方式打開源文件
if(srcFile == NULL)
{
printf("Source file open failure!!");
printf("Press any key to close!!");
getchar();
return 0;
}
if ( !access(argv[2],0) )
{
printf("%s EXISITS!!",argv[2]);
printf("Source file open failure!!");
printf("Press any key to close!!");
getchar();
return 0;
}
desFile = fopen(argv[2],"wb");//以寫入二進制方式打開目標文件
if(desFile == NULL)
{
printf("Destination file open failure!!");
printf("Press any key to close!!");
getchar();
return 0;
}
/* start copy */
while(!feof(srcFile))// 判斷當前指針的指向是否爲EOF
{
putc(getc(srcFile),desFile);
}
fclose(srcFile);
fclose(desFile);
return 0;
}
/* 這個程序如果想要更加的人性話,可以在用戶運行函數後,輸入源文件和目標文件,同時還應具備
檢查目標文件是否存在的問題,不然在複製文件時,可能導致其他文件受損。
*/
// 已經加入判斷文件是否存在