C++文件读写

 C++文件读写_第1张图片

1 简单读写文件

1 #include <fstream>  
2 ofstream         //文件写操作 内存写入存储设备   
3 ifstream         //文件读操作,存储设备读区到内存中  
4 fstream          //读写操作,对打开的文件可进行读写操作 

写文件用ofstream和ostream方法(如<<),读文件用ifstream和istream方法(如>>),读写文件可以用fstream,具体步骤个人总结为三步走:

写文件:

  1.创建一个ofstream对象     ofstream out;

  2.将对象与文件进行关联      out.open("1.txt");  

  3.用cout方式使用该对象      out<<"123456"; 

其中前两步可以合并为ofstream out("1.txt");

读文件:

  1.创建一个ifstream对象      ifstream in;

  2.将对象与文件进行关联      in.open("1.txt");  

  3.用cout方式使用该对象     string x;   int>>x; 

其中前两步可以合并为ifstream in("1.txt");  

注意:对象名称可以随意命名,不一定非得是in或out。

   文件读写完毕后文件自动关闭,亦可显示的关闭文件的连接,比如in.close();

 

2 文件模式

无论是使用文件名初始化文件流对象还是使用open()方法,都可以指定文件模式的第二个参数

ios::in       打开文件以便读取

ios::out    打开文件以便写入

ios::ate        打开文件移动到文件尾

ios::app       内容追加到文件尾

ios::trunc     删除之前内容再写入

ios::binary    二进制文件

这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如

1 fstream out("Hello.txt", ios::in|ios::out)

 

3 利用流复制文件的例子

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdlib>
 4 
 5 using namespace std;
 6 void cpf(char *a,char *b);
 7 
 8 int main()
 9 {
10     char sourcefile[100];
11     char copyfile[100];
12     cout<<"请输入要复制的文件路径"<<endl;
13     cin>>sourcefile;
14     cout<<"请输入要粘贴的文件路径"<<endl;
15     cin>>copyfile;
16 
17     cpf(sourcefile,copyfile);
18 
19     return 0;
20 }
21 
22 void cpf(char *a,char *b)
23 {
24     fstream in(a,ios::in | ios::binary);
25     if(!in.is_open())
26     {
27         cerr<<"源文件不存在"<<endl;
28         exit(EXIT_FAILURE);
29     }
30     fstream out(b,ios::out | ios::binary);
31     if(!out.is_open())
32     {
33         cerr<<"路径错误"<<endl;
34         exit(EXIT_FAILURE);
35     }
36     out<<in.rdbuf();
37     cout<<"文件复制成功"<<endl;
38 }

 需要注意的地方

1.文件路径是char数组,传递参数时应该将形参设为指针

2.复制文件应该用ios::binary(二进制模式),原因是使用二进制文件模式时,程序将数据从内存传递给文件,将不会发生任何隐藏的转换,而默认状态下是文本模式,复制的内容可能会发生改变(参见c++ primer plusP695)

3.关于 rebuf():复制文件时是从一个流对象复制流入另外一个流对象,需要使用rebuf(),rebuf()的功能就是使流重定向

4.exit(EXIT_FAILURE)相当于exit(1),exit(EXIT_SUCCESS)相当于exit(0)

5.注意#include<fstream> 也需要和using namespace std 搭配

 

4 随机存取

利用对文件指针的操作可以实现随机存取,考察函数:

定位文件指针函数:seekg()将输入指针移动到指定文件位置(对应读文件);seekp()将输出指针移动到指定文件位置(对应写文件),其原型有两种:

 (1) istream& seekg (streampos pos);                                              

//定位读文件指针到离文件开头特定距离(单位为字节)

 (2) istream& seekg (streamoff off, ios_base::seekdir way);                

//定位读文件指针到离第二个参数特定的距离(单位为字节) 第二个参数可以是:

ios_base::beg  文件开头
ios_base::cur   当前指针位置
ios_base::end  文件结尾位置

seekg与之类似,ios_base::beg 亦做ios::beg

检查文件指针当前位置,对输入流采用tellg()方法,对输出流,采用tellp()方法,一个C++获取文件大小的方法是:

1 in.seekg(0,ios::end);
2 long size;
3 size = in.tellg();

 

 

5 利用成员函数复制文件的例子

利用成员函数read()和wirte()复文件,函数原型如下:

istream &read(char *p,sizeof(p));

ostream &write(char *p,sizeof(p));

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7 
 8     fstream in("e:\\1.png",ios::in | ios::binary);
 9     if(!in.is_open())
10     {
11         cerr<<"源文件不存在"<<endl;
12         exit(EXIT_FAILURE);
13     }
14     fstream out("e:\\2.png",ios::out | ios::binary);
15     if(!out.is_open())
16     {
17         cerr<<"路径错误"<<endl;
18         exit(EXIT_FAILURE);
19     }
20     in.seekg(0,ios::end);
21     long size;
22     size = in.tellg();
23     char *buf = new char[size];
24     in.seekg(ios::beg);
25     in.read(buf,size);
26     out.write(buf,size);
27     delete [] buf;
28     cout<<"文件复制成功"<<endl;
29     return 0;
30 }

复制大文件时buf不应该开辟太大,可以分段复制,比如:

 1 const int bufsize = 1024;
 2     char buf[bufsize];
 3     in.seekg(0,ios::end);
 4     long size;
 5     size = in.tellg();
 6     in.seekg(ios::beg);
 7 
 8     while(!in.eof())
 9     {
10         in.read(buf,bufsize);
11         out.write(buf,bufsize);
12     }

 


                            

你可能感兴趣的:(文件读写)