C語言實現文件復制功能(包括文本文件和二進制文件)


文件的復制是常用的功能,要求寫一段代碼,讓用戶輸入要復制的文件以及新建的文件,然后對文件進行復制。能夠復制的文件包括文本文件和二進制文件,你可以復制1G的電影,也可以復制1Byte的txt文檔。

實現文件復制的主要思路是:開辟一個緩沖區,不斷從原文件中讀取內容到緩沖區,每讀取完一次就將緩沖區中的內容寫入到新建的文件,直到把原文件的內容讀取完。

這里有兩個關鍵的問題需要解決:
1) 開辟多大的緩沖區合適?緩沖區過小會造成讀寫次數的增加,過大也不能明顯提高效率。目前大部分磁盤的扇區都是4K對齊的,如果讀寫的數據不是4K的整數倍,就會跨扇區讀取,降低效率,所以我們開辟4K的緩沖區。

2) 緩沖區中的數據是沒有結束標志的,如果緩沖區填充不滿,如何確定寫入的字節數?最好的辦法就是每次讀取都能返回讀取到的字節數。

fread() 的原型為:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

它返回成功讀寫的塊數,該值小於等於 count。如果我們讓參數 size 等於1,那么返回的就是讀取的字節數。

注意:fopen()一定要以二進制的形式打開文件,不能以文本形式打開,否則系統會對文件進行一些處理,如果是文本文件,像.txt等,可能沒有問題,但如果是其他格式的文件,像.mp4, .rmvb, .jpg等,復制后就會出錯,無法讀取。

代碼實現:

 
          
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int copyFile(char *fileReadchar *fileWrite);
  4. int main(){
  5. char fileRead[100];  // 要復制的文件名
  6. char fileWrite[100];  // 復制后的文件名
  7. // 獲取用戶輸入
  8. printf("要復制的文件:");
  9. scanf("%s", fileRead);
  10. printf("將文件復制到:");
  11. scanf("%s", fileWrite);
  12. // 進行復制操作
  13. ifcopyFile(fileRead, fileWrite){
  14. printf("恭喜你,文件復制成功!\n");
  15. }else{
  16. printf("文件復制失敗!\n");
  17. }
  18. return 0;
  19. }
  20. /**
  21. * 文件復制函數
  22. @param fileRead 要復制的文件
  23. @param fileWrite 復制后文件的保存路徑
  24. @return int 1: 復制成功;2: 復制失敗
  25. **/
  26. int copyFile(char *fileReadchar *fileWrite){
  27. FILE *fpRead// 指向要復制的文件
  28. FILE *fpWrite// 指向復制后的文件
  29. int bufferLen 1024*4// 緩沖區長度
  30. char *buffer (char*)malloc(bufferLen);  // 開辟緩存
  31. int readCount// 實際讀取的字節數
  32. if(fpRead=fopen(fileRead"rb")) == NULL || (fpWrite=fopen(fileWrite"wb")) == NULL ){
  33. printf("Cannot open file, press any key to exit!\n");
  34. getch();
  35. exit(1);
  36. }
  37. // 不斷從fileRead讀取內容,放在緩沖區,再將緩沖區的內容寫入fileWrite
  38. while(readCount=fread(buffer1, bufferLen, fpRead)) ){
  39. fwrite(buffer, readCount1, fpWrite);
  40. }
  41. free(buffer);
  42. fclose(fpRead);
  43. fclose(fpWrite);
  44. return 1;
  45. }

運行結果:

要復制的文件:d://1.mp4
將文件復制到:d://2.mp4
恭喜你,文件復制成功!

如果文件不存在,會給出提示,並終止程序:

要復制的文件:d://123.mp4
將文件復制到:d://333.mp4
d://cyuyan.txt: No such file or directory


第46行是文件復制的核心代碼。通過fread()函數,每次從 fileRead 文件中讀取 bufferLen 個字節,放到緩沖區,再通過fwrite()函數將緩沖區的內容寫入fileWrite文件。

正常情況下,每次會讀取bufferLen個字節,即readCount=bufferLen;如果文件大小不足bufferLen個字節,或者讀取到文件末尾,實際讀取到的字節就會小於bufferLen,即readCount<bufferLen。所以通過fwrite()寫入文件時,應該以readCount為准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM