• 标准IO库 IO对象不可复制或赋值


    转载自 fangyuanhust
    最终编辑 fangyuanhust
    转载

    IO类型的3个独立的头文件:
    iostream定义读写控制窗口的类型,
    fstream 定义读写已命名文件的类型,             (包含fstream类)
    sstream定义读写存储在内存中的string对象。(包含了stringstream类)

    iostream 派生出 fstream 和 sstream。   

    头文件                 派生类   (基类)
    fstream -- ifstream(istream )   ofstream (ostream ) fstream(iostream)
    iostream -- istream ostream iostream(istream 和ostream )
    sstream -- istringstream (istream )   ostringstream(ostream )    stringstream(iostream)

    IO类型使用继承的另一个好处,如果函数有基类类型的引用形参时,可以给函数传递其派生类型的对象。
    例如,istream&进行操作的函数,可以使用 ifstream 和 istringstream对象来调用。
    因为IO类型采用继承关联,所以可以只编写一个函数,而将它应用到3种类型的流上:控制台、磁盘文件、字符串流。

    IO类型不可复制或赋值
    因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)
    ofstream out1,out2;
    out2 = out1; //error : cannot assign stream objects
    ofstream print(ofstream);
    out2 = print(out2); //error:cannot copy stream objects

    形参或返回类型也不能为流类型。如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
    ofstream &print(ofstream&); //ok:takes a reference,no copy
    while(print(out2)) { ... }          // ok:pass reference to out2
    一般,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写会改变它的状态,因此引用必须是非const的。


    至此,讨论的都是char类型组成的流,标准库还支持wchar_t(宽字符)类型。    在每个类前加个w即可,如wfstream、wstringstream等等。
    基于流的wchar_t类型的类和对象在iostream中定义,宽字符文件流类型在fstream中定义,而宽字符stringstream则在sstream头文件中定义。

    练习:

    1)ostream print(ostream os);
         这个声明是错的:首先,IO对象是不能复制的,要传递或返回IO对象时,必须传递或返回指向该对象的指针或引用。
          应该改成:   ostream &print(ostream& os);

    2) 假设os是一个ofstream对象,下面程序做了什么?
    os<<"Goodbye"<<endl;
        
        以下是我试着写的代码:
    #include <fstream>
    #include <string>
    #include <stdio.h>
    using namespace std;

    ifstream in("input.txt");
    ofstream out("output.txt");

    int main()
    {
    string str = "hi in";
    out<<str<<endl;
    return 0;
    }


    首先, out<<----------输出
       in>> ----------输入
    case 1:   os --- ofstream
       正常输出
    case 2:   os --- ifstream
       << 不对,
       也不能写入 endl;
       应该改成: string str; os>>str;
    case 3:   os --- ostringstream -----------这个不是针对文件流的,而是通过写入内存,所以不会在默认目录中自动生成一个名字为“output.txt”的文件。
                    此代码能正常运行,但是看不到有何运行结果。

  • 相关阅读:
    《卓有成效的管理者》读后感
    小课堂week13 Clean Code Part2
    小课堂Week12 Clean Code Part1
    小课堂Week11 会说话的代码
    小课堂Week10 例外处理设计的逆袭Part3
    Spark菜鸟学习营Day6 分布式代码运行调试
    UML(一) 类图及类间关系
    分布式事务(一)两阶段提交及JTA
    Java线程间通信方式剖析——Java进阶(四)
    Java进阶(三)多线程开发关键技术
  • 原文地址:https://www.cnblogs.com/yixiaoyang/p/2122731.html
Copyright © 2020-2023  润新知