網上的方法大致有這樣幾種:
1、使用操作系統提供的復制文件的API
2、使用C語言本身提供的復制文件的函數
3、直接讀寫文件,從文件角度來操作,從而直接將一個文件復制
這裡我們使用的就是這第三種。
復制文件的思路大概是這樣的,如果是文本類型,則可直接使用字符讀寫的方式,依次讀寫到另一個文件中。但如果是非字符型文件那應該怎麼進行操作呢?我的方法是使用二進制形式打開,然後依次針對字節進行操作,依次從文件第一個字節讀寫至最後一個字節實現文件的復制,那麼由此可得,這種方法同樣可以用在遠程的操作上,即實現文件的遠程傳輸。
那麼問題來了,怎麼針對字節來進行讀取文件呢?這裡我總結了兩種辦法。
注意:本文針對的解決方案是依字節讀取,如果覺得效率低得話可以多字節讀取,但這樣就存在一個問題,怎麼保證正好和源文件大小相同而不是比源文件大。那麼推薦的做法是先獲取源文件的大小,然後直接讀取進行操作。
在C語言系統中void型指針占用一個字節,char型占用一個字節,正好滿足我們的要求,所以可以分別使用來完成我們需要的操作。
需要注意,這裡我們用到的概念是類型並不是限制了使用的數據類型,不是說char型只能用來存放char型變量,數據類型提供的是一系列針對特定類型的操作,這方便了我們的操作,但不能存在思維定式,一種數據類型提供的是一種可能性,比如char型變量,它給了我們2^8種可能性,如果我們需要表示16種可能的話,完全可以使用一個char型變量來存放,而不是使用一個int型變量,節省了系統開銷。但真實情況下,需要考慮到程序的易讀性問題,而不是考慮內存的問題,更何況內存已經越來越便宜,空間越來越大,CPU性能越來越好。
源碼如下:
1 #include <stdio.h> 2 3 int main(int argc, char* argv[]) 4 5 { 6 7 FILE *op,*inp; 8 9 op=fopen("a.png","rb"); 10 11 inp=fopen("b.png","wb"); 12 13 void *buf; 14 15 char c; 16 17 while(!feof(op)) 18 19 { 20 21 //方法二 22 23 fread(&buf,1,1,op); 24 25 fwrite(&buf,1,1,inp); 26 27 28 29 //方法二 30 31 fread(&c,1,1,op); 32 33 fwrite(&c,1,1,inp); 34 35 } 36 37 fclose(inp); 38 39 fclose(op); 40 41 printf("over"); 42 43 return 0; 44 45 } 46 47
記錄下來,留待後查,同時方便他人。
謝謝支持!
可以聯系我進行交流。[email protected]
2016.1.30
22:26