您的位置:首页 > 编程语言 > C语言/C++

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



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: