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; in>>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 }