1. 程式人生 > >linux下使用C++程式操作檔案的讀寫(複製/拷貝)

linux下使用C++程式操作檔案的讀寫(複製/拷貝)

注意:在linux下使用eclipse+CDT執行下面的程式時,請在root狀態下!!!

在終端中,進入root狀態,然後在root狀態下,開啟eclipse,再執行下面的程式。

(因為涉及到檔案讀寫許可權,普通狀態可能無法完成操作,root狀態下會更好一些。)

.關於檔案操作的幾個基本函式

1.C函式庫中檔案操作函式

(1)fopen

函式原型:FILE* fopen(char *path, char *mode);

函式說明:開啟一個檔案。 

(2)fgetc

函式原型:int fgetc(FILE *stream);

函式說明:從檔案中讀取一個字元。出錯或檔案尾返回EOF

(3)fputc

函式原型:int fputc(int c, FILE *stream);

函式說明:將一個字元寫入到文字檔案中。

(4)fgets

函式原型:char* fgets(char *s, int size, FILE *stream);

函式說明:從檔案中讀取一行字串(遇回車換行則函式返回)。如果為檔案尾返回NULLs表示要儲存讀取到資料的位置,sizes的大小。

(5)fputs

函式原型:int fputs(char *s, FILE *stream);

函式說明:將一行字串寫入到檔案中。

(6)fprintf

函式原型:fsprintf(FILE *stream, const char *format, ...);

函式說明:格式化字串到檔案中。

(7)fread

函式原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函式說明:按每多少個位元組讀取檔案。ptr表示資料緩衝區,size表示每次讀取的位元組數,nmemb表示讀取的次數,函式返回讀取成功的次數,遇EOF結束讀取返回0.

(8)fwrite

函式原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函式說明:按每多少個位元組將資料寫入到檔案中。ptr表示資料緩衝區,size表示每次寫入的位元組數,nmemb表示寫入的次數。

(9)fseek

函式原型:int fseek(FILE *stream, long offset, int whence);

函式說明:移動檔案流的讀寫位置。

whence的可取值:SEEK_SET(檔案頭)SEEK_CUR(檔案當前位置)SEEK_END(檔案尾).

(10)fclose

函式原型:int fclose(FILE *stream);

函式說明:關閉一個檔案

2.Linux函式庫中檔案操作函式

(1)open

函式原型:int open(const char *pathname, int oflag, ...);

函式說明:開啟一個檔案。函式返回檔案描述符fd

(2)read

函式原型:size_t read(int fd, void *buf, size_t nbytes);

函式說明:按指定位元組大小讀取檔案。如果函式執行成功,read返回一個非負數,表示本次操作實際讀入的位元組數。遇EOF失敗返回-1.

(3)write

函式原型:size_t write(int fd, void *buf, size_t nbytes);

函式說明:按指定位元組大小寫入檔案。

(4)lseek

函式原型:off_t lseek(int fd, off_t offset, int whence);

函式說明:移動檔案讀寫流的位置。

(5)close

函式原型:int close(int fd);

函式說明:關閉一個檔案。

.檔案拷貝的三種方式

檔案拷貝在以後的很多地方會用到,比如FTP檔案傳輸、多執行緒下載等,所以熟練掌握檔案拷貝的幾種方式是以後學習的基礎。檔案拷貝的幾種方式中,fgetcfputcfgetsfputsfprintf只可以用來讀寫文字檔案,它們讀二進位制檔案會出現亂碼。而readwritefreadfwrite則都可以讀寫。值得注意的是,對文字檔案的處理一般用fgets等函式。下面列出檔案拷貝的三種實現方式(拷貝文字檔案):

  1. //copy1.cc
  2. #include <iostream>
  3. #include <fcntl.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>
  7. usingnamespace std;  
  8. int main(int argc, char *argv[])  
  9. {  
  10.     if(access(argv[1], F_OK) != 0)  
  11.     {  
  12.     cout << "file not found......" << endl;  
  13.     return 0;  
  14.     }  
  15.     int fin = open(argv[1], O_RDONLY, 0777);  
  16.     int fout = open(argv[2], O_WRONLY|O_CREAT, 0777);  
  17.     char buff[1024] = {'\0'};  
  18.     int len = 0;  
  19.     while((len = read(fin, buff, sizeof(buff))) > 0)  
  20.     {  
  21.     write(fout, buff, len);  
  22.     }  
  23.     close(fin);  
  24.     close(fout);  
  25.     return 0;  
  26. }  

  1. //copy2.cc
  2. #include <iostream>
  3. #include <stdio.h>
  4. usingnamespace std;  
  5. int main(int argc, char *argv[])  
  6. {  
  7.     FILE *fp1;  
  8.     fp1 = fopen(argv[1], "r");  
  9.     FILE *fp2;  
  10.     fp2 = fopen(argv[2], "w");  
  11.     char buff[200] = {'\0'};  
  12.     while(fgets(buff, sizeof(buff), fp1) != NULL)  
  13.     {  
  14.     fputs(buff, fp2);  
  15.     }  
  16.     fclose(fp1);  
  17.     fclose(fp2);  
  18.     return 0;  
  19. }  

  1. //copy3.cc
  2. #include <iostream>
  3. #include <stdio.h>
  4. usingnamespace std;  
  5. int main(int argc, char *argv[])  
  6. {  
  7.     FILE *fp1;  
  8.     fp1 = fopen(argv[1], "r");  
  9.     FILE *fp2;  
  10.     fp2 = fopen(argv[2], "w");  
  11.     char buff[1024] = {'\0'};  
  12.     int count = 0;  
  13.     while((count = fread(buff, 1, 1024, fp1)) != 0)  
  14.     {  
  15.     fwrite(buff, 1, count, fp2);  
  16.     }  
  17.     fclose(fp1);  
  18.     fclose(fp2);  
  19.     return 0;  
  20. }