精华内容
下载资源
问答
  • ifstream ostream istream ostream 不能声明

    千次阅读 2014-10-11 08:40:42
    当学习C++ IO时,有iostream的同时,还有istream,ostrream,有ifstream的同时,还有ifstream,
           当学习C++ IO时,有iostream的同时,还有istream,ostrream,有ifstream的同时,还有ifstream,ofstream。但是有时候发现不能声明istream,ifstream等等。加上using namespace std;即可
    展开全文
  • iostream, istreamostream的区别

    千次阅读 2020-02-04 20:54:58
    顾名思义 i代表输入input o代表输出output stream//流 iostream//输入输出流,这只是C++的一个流文件,因为C++的输入输出都是流处理的 istream//就是只管输入的流 ostream//就是只管输出的流 ...

    顾名思义

    i代表输入input

    o代表输出output

    stream//流

    iostream//输入输出流,这只是C++的一个流文件,因为C++的输入输出都是流处理的

    istream//就是只管输入的流

    ostream//就是只管输出的流

    (理论上应该是iostream包含了istream和ostream。但是如果只想使用ostream中的某个功能却使用了这个iostream,而iostream比较大,又包含了istream,那么这样的调用会浪费资源)

    展开全文
  • 类ifstream继承来自istream,类ofstream继承来自ostream,由于c++的多态特性,可以用iostream类的指针或者引用来指向ifstream。 open()、close() 如果打开文件失败failbit会被置位,因此每次调用open()应该调用if检查...


    C++支持不同种类的IO处理操作。

    • iostream处理控制台IO。
    • fstream处理文件文件IO。
    • stringstream完成内存string的IO。

    下表是C++中的IO操作类的定义以及头文件。
    在这里插入图片描述
    为了支持宽字符的语言,标准库定义了一些类型来操纵wchar_t 类型的数据。宽字符类型和普通自行没有都定义在同一个头文件中,在普通类型的前面添加w就行了,如何cin 相应的宽字符类型就是wcin
    我们在使用大多数的IO操作时是不需要考虑文件类型的,也就是说我们可以无差别的将IO操作应用于普通流、文件流、和string流,以及char或者宽字符。但是IO对象不能进行拷贝和赋值

    1.IO条件状态

    IO类定义了一些函数或者标志来指示IO是否正常或者出错。
    下表是常用的IO条件状态。
    在这里插入图片描述
    例子:

    int val;
    cin>>val;
    

    如果输入一个字符则以上IO操作将会出错,因为希望得到的是int而非char,一个流操作一旦发生错误则他的后续IO操作将无法进行。如何确定一个流操作是否正常?那就是将其作为条件判断。

    while(cin>>word)
    {
    	//IO操作
    }
    

    但是,有时我们需要具体知道流IO具体发生的错误我们可以上表提供的操作判断,举例:

    	int a;
        cin>>a;
    
        if (cin.fail())
        {
            cout << "输入错误!" << endl;
        }
        else if (cin.good())
        {
            cout << a << endl;
        }
        else if (cin.bad())
        {
            throw runtime_error("IO已经崩溃!");
        }
    

    如果对于输入的不是int 的数据则会发生错误,程序会输出“输入错误”。如果程序奔溃则相应的bad()会返回true。

    clear() 函数将所有的标志位恢复为初始状态,其有两个版本的重载,一个有参数一个无参数。有参数的重载只会将传入参数的标志位重置。

    一般使用流之前会保存该流的属性,当使用完成后将该流恢复。

    auto old=cin.rdstate();
    cin.clear();//将所有的位标志置为初始化状态。
    /*使用IO流操作*/
    cin.setstate(old);
    

    2.输出缓冲区

    刷新输出缓冲区
    刷新方式有三种,分别是endl、ends、flush;

    cout<<"hello"<<endl;//附加换行并刷新缓冲区;
    cout<<"hello"<<ends;//附加一个空字符并刷新缓冲区;
    cout<<"hello"<<flush;//刷新缓冲区,不添加附加任何东西。
    

    unitbuf、nonunitbuf操纵符
    unitbuf将输出流设置位每次输出后自动执行flush刷新,nonunitbuf则是将输入流恢复到正常的刷新模式。

    cout<<unitbuf;
    /*进行输出操作*/
    cout<<nonunitbuf;
    

    关联输入输出流
    当一个输入流被关联到一个输出流时任何试图输入流读数据的操作都会先刷新关联的输出流。便准库将cin和cout关联.。
    tie()函数是有两个重载版本,未带参数的版本用于判断对象是否关联到输出流,如果有关联输出流则返回输出流对象指针,否则返回空指针。带参数的用于将一个输入流关联到输出流,如:x.tie(&o)

    cin.tie(&cout);//cin关联到cout
    ostream *old_tie=cin.tie(nullptr);//cin不在和任何输出流关联,返回指针为以前关联的输出流;
    cin.tie(&cerr);//cin和cerr关联
    cin.tie(old_tie);//cin恢复到以前的关联
    

    3.文件IO流

    头文件fstream定义了三个类型来支持文件IO:ifstream从一个文件读取数据,ofstream向一个文件写入数据,以及fstream可以读写给定文件。
    fstream继承iostream,但是除了iostream的操作外,fstream还提供了其他的操作。
    在这里插入图片描述文件的打开与关闭
    文件的打开方式有两种,一种是利用构造函数在定义时直接输入文件,另一种则是利用open()函数

     ofstream out("F:\\test1.txt");//初始化时直接打开文件
     ifstream in;
     in.open("F:\\test.txt");//用open函数打开文件
     string temp;
     getline(in, temp);//读取文件test.txt的一行到temp
     out << temp;//将读取temp的输出到文件test1.txt
     in.close();//关闭文件
     out.close();
    

    类ifstream继承来自istream,类ofstream继承来自ostream,由于c++的多态特性,可以用iostream类的指针或者引用来指向ifstream。

    open()、close()
    如果打开文件失败failbit会被置位,因此每次调用open()应该调用if检查。

    if(in){
    	//执行文件操作
    }
    

    一个文件流对象只能同时和一个文件相关联,因此用完用完文件后应该调用close()函数关闭文件,同时文件将不再和文件流关联。

    当一个fstream对象被销毁时析构函数会自动调用close();

    文件打开模式
    在这里插入图片描述
    文件的模式在文件的打开时或者定义对象初始化时指定,指定方式为如下:

    fostream out("file",ofstream::out);//初始化时指定文件模式
    fostream out1;
    out1.opent("file1",ofstream::out);//调用open()时指定文件模式
    

    指定文件的打开模式有以下限制:

    • out模式只能对应ofstream和fstream;
    • in模式只能对应ifstream和fstream;
    • trunc模式只能在out模式下设定
    • trunc模式没有被设定是才能设定app模式,app模式下文件为out模式(只能输出)
    • 默认情况的out会将文件截断,只有同时指定out和app或者out和in时文件才不会被截断。
    • ate和binary能和任何模式进行组合。
    • ifstream默认为in,ofstream默认为out,fstream默认两者同时打开。

    注意:以默认的方式打开ofstream文件会数据会丢失,保留文件的唯一方式是显示指定app或者in模式

    4.string流

    istringstream从string读取数据,ostringstream向string写入数据,而stringstream可以进行读也可以写。同样stringstream都是继承自iostream的。stringstream的独特的方法:
    在这里插入图片描述
    istringstream可以将与其绑定的字符串以”单词“的形式读出:
    例子:

    string str = "this is a test for sstream";
    istringstream word(str);
    while (word >> str)
    {
        cout << str << endl;
    }
    

    上述例子将会把字符串中的灭个单词打印出来。

    stringstream常用操作

    string str1=word.str();//无参数的str()返回word的拷贝字符串
    word.str("this is a reset");//重置word的拷贝字符串,此时str()返回void
    

    ostringstream可以将与其绑定的字符串以”单词“的形式写入到string流;

    ostringstream o_word;
    auto li = initializer_list<string>({"this ","is ","test"});
    
    for (auto it = li.begin(); it != li.end(); it++)
    {
       o_word << *it;
    }
    cout << o_word.str();
    

    上述的程序将会打印”this is a test“到终端。
    关于程序中的initializer_list 请参考:https://editor.csdn.net/md/?articleId=112553878

    展开全文
  • C++重载istreamostream

    千次阅读 2020-10-19 20:16:05
    } 这里重载的 “+”号,是因为我们可以直接去修改对象的值 然而,对于 << >>来说,其左侧必须是istream 或者 ostream的对象,我们没办法去直接改变istream对象的值(不然就得去的源代码中修改),所以也就没办法把...

    对于一般的运算符重载,可以重载为类的成员函数,这是因为操作符的第一个元素一定是本类的对象(this)

    例如

    #include<iostream>
    using namespace std;
    
    class book {
    public:
        book (int n):bookNo(n) {}
        int getBookNo () {
            return bookNo;
        }
        book operator+ (book b) {
            book result(0);
            result.bookNo = bookNo + b.bookNo;
            return result;        
        }
    private:
        int bookNo;
    };
    
    int main () {
        book a(10), b(20);
        auto res = a + b;
        cout << res.getBookNo();
    }

    这里重载的 “+”号,是因为我们可以直接去修改对象的值

    然而,对于 << >>来说,其左侧必须是istream 或者 ostream的对象,我们没办法去直接改变istream对象的值(不然就得去<iostream>的源代码中修改),所以也就没办法把它写为当前类的成员函数。

    解决方法1:

    申明为当前类的友元函数,这样就可以直接访问类的私有对象(但是会破坏封装性)

    #include<iostream>
    using namespace std;
    
    class book {
    public:
        int getBookNo () {
            return bookNo;
        }
        friend istream& operator>> (istream& in, book& b);
        friend ostream& operator<< (ostream& out, book b);
    private:
        int bookNo;
    };
    
    istream& operator>> (istream& in, book& b) {
        in >> b.bookNo;
        return in;
    }
    ostream& operator<< (ostream& out, book b) {
        out << b.bookNo;
        return out;
    }
    
    int main () {
        book b;
        cout << "input book number: ";
        cin >> b;
        // cout << "book number is " << b.getBookNo() << endl;
        cout << b;
    }
    
    

    可以看到声明为book类友元的全局函数operator<< 和 operator >>直接访问了book类的私有变量成员bookNo

    解决方法2:

    使用一些成员函数来暴露对类成员的访问,然后使用类外的普通函数重载来进行类成员的输入输出。

    #include<iostream>
    using namespace std;
    
    class book {
    public:
        int getBookNo () {
            return bookNo;
        }
        void setBookNo (int n) {
            bookNo = n;
        }
    private:
        int bookNo;
    };
    
    istream& operator>> (istream& in, book& b) {
        int tmp;
        in >> tmp;
        b.setBookNo(tmp);
        return in;
    }
    ostream& operator<< (ostream& out, book b) {
        out << b.getBookNo();
        return out;
    }
    
    int main () {
        book b;
        cout << "input book num: ";
        cin >> b;
        cout << "book num is " << b;
    }
    
    

    至于为什么这里返回的是引用呢?

    这里还没彻底弄明白,如果返回的不是引用,会报如下错误:

    也就是当返回值不是引用时,就会调用拷贝构造函数,但是看上图可知道 istream和ostream的拷贝构造都被显示的删掉了!!

    那为什么要显示的删掉拷贝构造呢?

    是因为要保证输入,输出流对象是同一个对象

    比如,cin >> a >> b;

    如果返回不是引用,那么cin >> a产生一个istream的对象(开辟一段新空间),又作为 >> b左侧的istream的对象,这两个对象不能保证是同一个对象。可能发生如下情况:

    而返回时引用的时候,可以保证,cin >> a >> b >> c都在同一个流对象中

     

    展开全文
  • 所以对于一般要自定义流式操作需要了解istream/ostream, streambuf这两个类的用途。 这里只用istream也就是输入流举例: istream定义了对设备或者buffer的操作方法,包含的方法有read,readsome, >>这些读取...
  • 我们所熟悉的输入输出操作分别是由istream(输入流)和ostream(输出流)这两个类提供的,为了允许双向的输入/输出,由istreamostream派生出了iostream类。 iostream库定义了以下三个标准流对象: cin,表示...
  • c++进阶之---istream/ostream简介

    千次阅读 2011-04-10 13:01:00
    <br />istream类 建模了一个从任意输入设备流向一个执行着的程序的字符序列。为此'>>'也被称之为提取操作符。 默认情况下,>>运算符提取并丢弃前导的空白字符——空格、制表符和行结束符。但是要注意,...
  • 主要介绍了C++中与输入相关的istream类成员函数简介,包括eof函数和peek函数以及putback函数还有ignore函数,需要的朋友可以参考下
  • istream/ostream

    千次阅读 2009-07-08 14:57:00
    #include#include#include#includeusing namespace std;class Node /*自定义的类,只有两个整型... Node():x(0),y(0) {} Node(int xx,int yy):x(xx),y(yy) {} /*输入输出*/ friend std::ostream& operator frie
  • ios,istreamostream类对象返回值

    千次阅读 2013-06-17 14:52:16
    在ios,istreamostream类中,还定义了若干输入输出函数,它们主要用于错误处理,流的刷新以及流输入输出方式的控制.  错误处理  在对一个流对象进行I/O操作时,可能会产生错误。当错误发生时,错误的性质被记录在...
  • 今天在看《STL源码剖析》的时候,看到了配接器中的ostream iterator,其中包含istream_iterator以及ostream_iterator以及更多,感觉这两个都十分重要,所以在这里介绍一下 istream_iterator 源码: template &...
  • istream_iterator // 执行此句时会等待一个输入 istream_iterator<int> iptr(cin), eof; // 执行此句后,相当于再等待一个新的输入 iptr++; ostream_iterator // 执行此句时不会产生输出 // 需要一...
  • 转: http://blog.csdn.net/bichenggui/article/details/4600153
  • 标准程序库定义有供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入。使用这两个iteratorclasses之前,先得含入iterator头文件:#include&lt;...
  • 所谓iostream iterators,可以将迭代器绑定到某个iostream对象身上,绑定到istream对象身上的,称为istream_iterator,拥有输入功能;绑定到ostream对象身上的,称为ostream_iterator,拥有输出功能。这种迭代器运用...
  • istream_iterator及ostream_iterator使用实例 并利用ostream_iterator输出vector 输入: cert ecjtu 输出: cert ecjtu */ vector vecStr; istream_iterator infile(cin); istream_iterator eoffile; ostream_...
  • istream_iterator 在<iterator>头文件的定义中 定义istream_iterator变量的方法为 istream_iterator<T> in(strm);    (其中T指明此istream_iterator的输入类型 , strm为istream_it...
  • c语言的标准输入输出库是stdio.h 是一个函数库而不是类库。 其中包括了我们最常使用的scanf printf 都是一些独立的全局函数,因为C语言是不支持类...最常使用的是cin和cout,这两个都是对象,cin是istream类的对象...
  • istream_iterator和ostream_iterator学习体会

    万次阅读 2011-08-14 13:18:21
    istream_iterator 在头文件的定义中 定义istream_iterator变量的方法为 istream_iterator in(strm); (其中T指明此istream_iterator的输入类型 , strm为istream_iterator指向的流)
  • http://stackoverflow.com/questions/8117566/why-istream-object-can-be-used-as-a-bool-expression http://stackoverflow.com/questions/22954106/is...
  • C++ STL中定义了提供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入: (1)头文件:#include &lt;iterator&gt; (2)定义:  1)定义...
  • //流迭代器istream_iterator 和 ostream_iterator的使用 #include #include #include #include #include using namespace std; int main() { //创建istream_iterator时可以直接将其绑定到一个流上,另一种...
  • 解读C++重载ostreamistream C++中,我们可以重载输入输出流操作符<<与>>来自定义其输入输出功能。 class Foo { public: Foo() :high(0), wide(0){} Foo(int a, int b) :high(a...
  • C++ istream get() ostream::put()

    千次阅读 2016-08-25 09:59:00
    ostream& put (char c); // typewriter #include <iostream> // std::cin, std::cout #include <fstream> // std::ofstream int main () { std ::ofstream outfile ( "test.txt" ); char ch; ...
  • class stu{ public: int age; int score; string name; stu(int age,int score,string name):... friend ostream& operator << (ostream & os, stu& s){ os << s.age << ' ' <&
  • fstream,ifstream,ofstream 详解与用法

    万次阅读 多人点赞 2012-02-02 09:50:28
    fstream,istream,ofstream 三个类之间的继承关系 fstream :(fstream继承自istream和ofstream) 1.typedef basic_fstream > fstream;// 可以看出fstream就是basic_fstream 2.template class basic_fstream: ...
  • 标准程序库定义有供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入。使用这两个iteratorclasses之前,先得含入iterator头文件: #include 现在让...
  • NULL 博文链接:https://cherishlc.iteye.com/blog/2400974
  • // ostream_iterator example #include <iostream> // std::cout #include <iterator> // std::ostream_iterator #include <vector> // std::vector #include <algorithm> ...
  • 标准程序库定义有供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入。使用这两个iteratorclasses之前,先得含入iterator头文件:#include现在让我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,876
精华内容 11,550
关键字:

istreamostream