linux下使用C++程序操作文件的读写(复制/拷贝)

转自https://blog.csdn.net/qiurisuixiang/article/details/6642734

注意:在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等函数。下面列出文件拷贝的三种实现方式(拷贝文本文件):

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

[cpp]  view plain  copy
  1. //copy2.cc  
  2. #include   
  3. #include   
  4. using namespace std;  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     FILE *fp1;  
  9.     fp1 = fopen(argv[1], "r");  
  10.     FILE *fp2;  
  11.     fp2 = fopen(argv[2], "w");  
  12.   
  13.     char buff[200] = {'\0'};  
  14.     while(fgets(buff, sizeof(buff), fp1) != NULL)  
  15.     {  
  16.     fputs(buff, fp2);  
  17.     }  
  18.   
  19.     fclose(fp1);  
  20.     fclose(fp2);  
  21.   
  22.     return 0;  
  23.       
  24. }  

[cpp]  view plain  copy
  1. //copy3.cc  
  2. #include   
  3. #include   
  4. using namespace std;  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     FILE *fp1;  
  9.     fp1 = fopen(argv[1], "r");  
  10.     FILE *fp2;  
  11.     fp2 = fopen(argv[2], "w");  
  12.   
  13.     char buff[1024] = {'\0'};  
  14.     int count = 0;  
  15.     while((count = fread(buff, 1, 1024, fp1)) != 0)  
  16.     {  
  17.     fwrite(buff, 1, count, fp2);  
  18.     }  
  19.   
  20.     fclose(fp1);  
  21.     fclose(fp2);  
  22.   
  23.     return 0;  
  24. }  

你可能感兴趣的:(技术文档)