C++ 文件重定向

    xiaoxiao2021-03-25  74

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

     

    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/

    转载请注明原文地址: https://ju.6miu.com/read-35073.html

    最新回复(0)