C++文件读写
2015-03-19 19:14
405 查看
1 简单读写文件
#include <fstream> ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中 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 二进制文件
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如
fstream out("Hello.txt", ios::in|ios::out)
[b]3 利用流复制文件的例子[/b]
#include <iostream> #include <fstream> #include <cstdlib> using namespace std; void cpf(char *a,char *b); int main() { char sourcefile[100]; char copyfile[100]; cout<<"请输入要复制的文件路径"<<endl; cin>>sourcefile; cout<<"请输入要粘贴的文件路径"<<endl; cin>>copyfile; cpf(sourcefile,copyfile); return 0; } void cpf(char *a,char *b) { fstream in(a,ios::in | ios::binary); if(!in.is_open()) { cerr<<"源文件不存在"<<endl; exit(EXIT_FAILURE); } fstream out(b,ios::out | ios::binary); if(!out.is_open()) { cerr<<"路径错误"<<endl; exit(EXIT_FAILURE); } out<<in.rdbuf(); cout<<"文件复制成功"<<endl; }
需要注意的地方
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 搭配
[b]4 随机存取[/b]
利用对文件指针的操作可以实现随机存取,考察函数:
定位文件指针函数: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++获取文件大小的方法是:
in.seekg(0,ios::end); long size; size = in.tellg();
[b]5 利用成员函数复制文件的例子[/b]
利用成员函数read()和wirte()复制文件,函数原型如下:
istream &read(char *p,sizeof(p));
ostream &write(char *p,sizeof(p));
#include <iostream> #include <fstream> using namespace std; int main() { fstream in("e:\\1.png",ios::in | ios::binary); if(!in.is_open()) { cerr<<"源文件不存在"<<endl; exit(EXIT_FAILURE); } fstream out("e:\\2.png",ios::out | ios::binary); if(!out.is_open()) { cerr<<"路径错误"<<endl; exit(EXIT_FAILURE); } in.seekg(0,ios::end); long size; size = in.tellg(); char *buf = new char[size]; in.seekg(ios::beg); in.read(buf,size); out.write(buf,size); delete [] buf; cout<<"文件复制成功"<<endl; return 0; }
复制大文件时buf不应该开辟太大,可以分段复制,比如:
const int bufsize = 1024; char buf[bufsize]; in.seekg(0,ios::end); long size; size = in.tellg(); in.seekg(ios::beg); while(!in.eof()) { in.read(buf,bufsize); out.write(buf,bufsize); }