Linux檔案操作的練習1(cp的實現)
阿新 • • 發佈:2021-01-12
技術標籤:嵌入式
1.實現cp指令:
首先要搞清楚的一點就是cp指令的使用方法:
cp demo1.c demo2.c 將demo1.c的內容拷貝到demo2.c中去
因此出現了一個問題就是,cp後面要緊跟著兩個引數(原檔案、新檔案),我們該怎樣實現這一功能。因此要引出main函式的引數,這個在windows下dev-c++中建立一個project的時候,其實預設給的main函式,就是帶引數argc和argv的,讓我們來寫一個test1.c檔案來看看這兩個引數代表的是什麼東西。
#include <stdio.h>
int main(int argc,char** argv) {
printf("The number of parents:%d\n",argc);
printf("No.1 parent:%s\n",argv[0]);
printf("No.2 parent:%s\n",argv[1]);
printf("No.3 parent:%s\n",argv[2]);
return 0;
}
執行結果如圖所示:
很顯然,main函式中argc代表的是引數的個數,二級指標argv是一個二維字元陣列,儲存的各個引數的名稱,根據這一知識點我們就可以開始寫我們自己的mycp了。
我的程式碼:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv){
int fdSrc,fdDes;
if(argc < 3){
//這裡這個雄壯性是借鑑老陳的
printf("The number of argc is wrong!\n" );
exit(0);
}
fdSrc = open(argv[1],O_RDONLY);
if(fd == -1){
fd = open(argv[1],O_RDWR|O_CREAT,0600);
}
char Rbuf[1024];
//設定一個可以讀1M的快取區
int Rtypes = read(fdSrc,Rbuf,1024);
fdDes = open(argv[2],O_WRONLY);
if(fdDes == -1){
fdDes = open(argv[2],O_RDWR|O_CREAT,0600);
}
int Wtypes = write(fdDes,Rbuf,strlen(Rbuf));
close(fdSrc);
close(fdDes);
return 0;
}
執行結果卻出現了點小問題,這個第二行開始有亂碼:
其實解決方法很簡單,只需要將 Rbuf 初始化全部為{‘\0’}就好,而且這個程式碼在“貼上”的這個過程中,如果位元組數不夠1M,不僅浪費時間,還浪費空間;而且還存在了一個bug就是,write只能去覆蓋,所以複製之後的檔案可能會有錯誤,所以通過聽完老陳的講解,我給他優化了一下:
優化後的程式碼:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv){
int fdSrc,fdDes;
if(argc < 3){
printf("The number of argc is wrong!\n");
exit(0);
}
fdSrc = open(argv[1],O_RDONLY);
//=================================================
int size = lseek(fdSrc,0,SEEK_END) //|
lseek(fdSrc,0,SEEK_SET); //|
//這步必須有,否則指標在文字尾部,什麼也讀不到了 //|
//=================================================
if(fd == -1){
fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);
}
//=================================================
char* Rbuf; //|
Rbuf = (char*)malloc(size * sizeof(char) + 1) //|
//=================================================
int Rtypes = read(fdSrc,Rbuf,size); //|
fdDes = open(argv[2],O_WRONLY);
if(fdDes == -1){
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
//記住這個O_TRUNC:如果新文字有內容,就全部去掉
}
int Wtypes = write(fdDes,Rbuf,strlen(Rbuf));
close(fdSrc);
close(fdDes);
return 0;
}