文件的重定向就是把由键盘输入,屏幕输出转换为输入文件作为输入,把内容放入输出文件。就要用到文件输入输出的类:
ifstream/ofstream/fstream
这些类的关系是:
fstream 读写操作,对打开的文件进行读写操作
ofstream 文件写操作,内存写入存储设备
ifstream 文件读操作,存储设备读到内存中
(只需要读的时候用ofstream,只需要写用ifsterm,读写都用fstream)
用一段程序解释:
#include
#include
#include
using namespace std;
main()
{
ifstream fin("inputisbn.txt");//已有输入文件
ofstream fout("outisbn.txt");//已有输出文件
streambuf*cinbackup;
streambuf*coutbackup;
coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向
cinbackup=cin.rdbuf(fin.rdbuf());
cout<<"write"<
>line;
cout<
例1
#include <iostream>
#include<ostream>
#include<fstream>
using namespace std;
main()
{
ifstream fin("inputisbn.txt");//已有输入文件
ofstream fout("outisbn.txt");//已有输出文件
streambuf*cinbackup;
streambuf*coutbackup;
coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向
cinbackup=cin.rdbuf(fin.rdbuf());
cout<<"write"<<endl;
char line[100];
cin>>line;
cout<<line;
//restore standard streambuf
cin.rdbuf(cinbackup);//取消,恢复键盘输入
cout.rdbuf(coutbackup);//取消,恢复屏幕输出
return 0;
}
1.打开你需要读或者写的文件。
在fstream类中使用成员函数open()可以打开需要的文件。
public member function
void open ( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );
void open(const wchar_t *_Filename,
ios_base::openmode mode= ios_base::in | ios_base::out,
int prot = ios_base::_Openprot);
参数: filename 操作文件名
mode 打开文件的方式
prot 打开文件的属性
mode的各种情况:
ios::in
为输入(读)打开文件
ios::out
为输出(写)打开文件
ios::ate
初始位置:文件尾
ios::app
所有输出附加在文件尾
ios::turnc
若文件已存在先删除文件
ios::binary
二进制方式
ios::nocreate
不建立文件,文件不存在的时候打开失败
ios:;replace
不替代文件,文件存在的时候打开失败
这些方式可以使用或 “|”的方式一起使用。
prot情况:
0
普通文件,打开操作
1
只读文件
2
隐含文件
3
系统文件
比如说:
fstream inout //定义fstream类的一个对象
inout.open(filename,ios::in|ios::out|ios::binary)//表示打开一个可读可写的二进制文件。
在例1中,并没有使用显式的调用open函数,而是使用一个类的对象直接打开文件,这种情况也是可行的。
ifstream fin("inputisbn.txt");//已有输入文件
ofstream fout("outisbn.txt");/已有输出文件
因为在stream类的构造函数中有open()函数,同样构造函数也调用了open()函数,所以无需自己在操作。
重点:
每个类的默认打开方式不同
类
默认打开方式
fstream
ios::in|ios::out默认创建文件,除非指定ios::in或ios::nocreat
istream
ios::in 默认不创建文件
ostream
ios::out默认创建文件,除非指定ios::nocreat
检查文件是否正常打开的方式:
is_open(),返回bool值,ture文件被打开,false相反。
其余检查文件的方式:
bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
fail()
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true,例如当想要读入一个整数,而获得了一个字母的时候。
eof()
如果读文件到达文件末尾,返回true。
good()
这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。
2.设置流指针
在计算机中输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。
但是实际的操作过程中并不是流直接将数据融入需要的地方,比如说文件,屏幕。而是经过一段缓冲区在缓冲区满胡这是遇到endl后,将缓冲区的内容送走,并清空缓冲区。对于缓冲区在C++中也是用类来实现。流缓冲类streambuff,使用该类的成员可以访问到流缓冲区中的数据。
对于cout对象来说,他默认的输出是在标准输出设备(屏幕),cin是标准输入设备(键盘)。当我们需要使用其他的方式输入或输出就需要将输入输出重定向。
streambuf*cinbackup;
streambuf*coutbackup;
//定义两个可以用来指向流缓冲区内容的流缓冲指针
/*rdbuf可用来将流重新定义到需要的地方
streambuf* rdbuf() const;
streambuf* rdbuf (streambuf* sb);
1)无参数。返回调用者的流缓冲指针。
2)参数为流缓冲指针。它使调用者与参数(流缓冲指针)关联,返回自己当前关联的流缓冲区指针。
*/
coutbackup=cout.rdbuf(fout.rdbuf());//用rdbuf()重定向
cinbackup=cin.rdbuf(fin.rdbuf());
/*这两句代码可以扩充为:
coutbackup=cout.rdbuf(); /*coutbackop为当前的标准输出流指针*/
cinbackup=cin.rdbuf(); /*cinbackup是当前的标准输入流指针*/
cout.rdbuf(fout.rdbuf());
/*使用rdbuf()将当前的标准输出流(屏幕)重定向到文件的写入流*/
cin.rdbuf(fin.rdbuf());
*/
cout<<"write"<<endl; //重定向完成后,使用cout就可以将数据写入对应的文件中
char line[100];
cin>>line;
//从inputisbn.txt文件中读数据(100个数据或者是遇到空格截止)
cout<<line; //将读到的数据继续写入输出文件
大致文件的重定向就是这些了,以上皆是本人自己的理解,若有问题请帮忙指出,不胜感激!
参考出处:
C++的输入输出与标准输出流
http://blog.csdn.net/oniy_/article/details/39828247
C++文件读写详解(ofstream,ifstream,fstream)
http://blog.csdn.net/kingstar158/article/details/6859379/