C++ 文件重定向

文件的重定向就是把由键盘输入,屏幕输出转换为输入文件作为输入,把内容放入输出文件。就要用到文件输入输出的类:

 

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.openfilename,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::inios::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/


  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值