文件內容復制的常規方法:
- 開辟一段空間,不斷讀取文件的內容並寫入另一文件當中,這種方法好在安全,一般在類型允許的最大范圍內是安全的,缺點就是復制內容的時間長
- 一次性復制文件的內容,這種方法必須首先獲取當前被復制的文件內容的大小,然后一次性開辟與文件內容大小相同的內存空間,通常為了安全,都必須讓大小加1。
讀取文件內容的步驟
- 打開被復制文件(open/fopen)
- 讀取文件內容(read/fread)--->當使用系統IO(open這一類)的時候可以直接讀取內容,但當使用標准IO(fopen這一類)的時候,必須進行下一步
- 標准IO讀取文件內容的時候,必須先獲取到文件內容的大小,通常使用fseek和ftell來獲取,系統IO則不用
- 寫入另一份文件中進行保存(write/fwrite)
- 關閉打開的文件
具體的操作(考慮到移植性,本文章使用標准IO進行操作)
- 使用fopen打開被復制的文件和創建一個保存的文件,並判斷是否打開或創建成功
- 使用fseek和ftell來獲取當前復制文件的內容大小fileSize;
- 開辟一個內存空間,建議使用動態開辟的方法,比如mallco,calloc,new等
- 使用fread讀取被復制文件的內容,使用fwrite寫進到保存文件中
- 使用fclose關閉上述的兩個文件
代碼顯示
1 #include <stdio.h> 2 3 int main(int argc,char *argv) 4 { 5 //以只讀的方式打開被復制的文件 6 FILE *srcFd = fopen("./source.txt","r"); 7 if(NULL == srcFd) 8 { 9 printf("open source file failed\n"); 10 return -1; 11 } 12 13 //以讀寫的方式創建一個不存在的文件 14 FILE *dstFd = fopen("./save.txt","w+"); 15 if(NULL == dstFd) 16 { 17 printf("open save file failed\n"); 18 return -1; 19 } 20 21 //進行獲取文件大小的操作 22 fseek(srcFd,0,SEEK_END); //將光標移動到文件末尾 23 long fileSize = ftell(srcFd); //獲取文件的大小 24 fseek(srcFd,0,SEEK_SET); //將光標恢復到文件的開頭 25 26 //開辟一個新空間(動態開辟) 27 char *dataBuf = (char *)calloc(1,fileSize+1); 28 if(NULL == dataBuf) 29 { 30 printf("calloc a memory failed\n"); 31 return -1; 32 } 33 34 //讀取文件的內容 35 long retSize = fread(dataBuf,1,fileSize,srcFd); 36 if(retSize != fileSize) 37 { 38 printf("read file context failed\n"); 39 return -1; 40 } 41 42 //寫入保存文件中 43 retSize = fwrite(dataBuf,1,fileSize,dstFd); 44 if(retSize != fileSize) 45 { 46 printf("write context in file failed\n"); 47 return -1; 48 } 49 50 //關閉文件和釋放內存空間 51 fclose(srcFd); 52 fclose(dstFd); 53 54 free(dataBuf); 55 56 return 0; 57 }