文件的重定向就是把由键盘输入,屏幕输出转换为输入文件作为输入,把内容放入输出文件。就要用到文件输入输出的类:
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
#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"< char line[100]; cin>>line; cout< //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"< char line[100]; cin>>line; //从inputisbn.txt文件中读数据(100个数据或者是遇到空格截止) cout< 大致文件的重定向就是这些了,以上皆是本人自己的理解,若有问题请帮忙指出,不胜感激! 参考出处: C++的输入输出与标准输出流 http://blog.csdn.net/oniy_/article/details/39828247 C++文件读写详解(ofstream,ifstream,fstream) http://blog.csdn.net/kingstar158/article/details/6859379/