zoukankan      html  css  js  c++  java
  • STL基础--流

    介绍

    // cout: 全局ostream对象,(typedef basic_ostream<char> ostream)
    // <<: ostream& ostream::operator<< (string v);
    // endl: '
    ' + flush
    
    {
    ofstream of("MyLog.txt");	//如果文件不存在,新建
    of << "Experience is the mother of wisdom" << endl;
    of << 234 << endl;
    of << 2.3 << endl;
    
    of << bitset<8>(14) << endl;	//00001110
    of << complex<int>(2, 3) << endl;	//(2, 3)
    }  //RAII
    

    文件流和错误句柄

    • 输出文件流
    ofstream of("MyLog.txt");	//清除文件内容
    ofstream of("MyLog.txt", ofstream::app);	//将输出指针移到文件末尾
    of << "Honesty is the best policy." <<endl;
    
    ofstream of("MyLog.txt", ofstream::in | ofstream::out);
    of.seekp(10, ios::beg);	//将输出指针至文件开头之后的10个字符处
    of << "12345";	//覆盖写5个字符
    of.seekp(-5, ios::end);	//将输出指针移到文件末尾前5个字符处
    of.seekp(-5, ios::cur);	//将输出指针移到当前位置前5个字符处
    
    • 输入文件流
    ifstream inf("MyLog.txt");
    int i;
    inf >> i;	//读入一个单词, 失败
    //错误状态: goodbit, badbit, failbit, eofbit
    inf.good();	//一切OK(goodbit == 1)
    inf.bad();	//不可恢复的错误(badbit == 1)
    inf.fail();	//失败的刘操作,往往可恢复 (failbit == 1, badbit == 1)
    inf.eof();	//文件尾(eofbit == 1)
    
    inf.clear();	//清除所有错误状态
    inf.clear(ios::badbit);	//将错误标志设置一个新值
    
    inf.rdstate();	//读当前状态flag
    inf.clear(inf.rdstate() & ~ios::failbit);	//只清除failbit位
    
    if (inf)	//等效于: if (!inf.fail())
        cout << "Read successfully";
    
    inf.exceptions(ios::badbit | ios::failbit); //设置异常mask
    //badbit或failbit为1时,抛出ios::failure异常
    //eofbit为1时,不抛
    inf.exception(ios::goodbit);	//不抛异常
    

    格式化数据

    cout << 34 << endl; //34
    cout.setf(ios::oct, ios::basefield);
    cout << 34;		//42
    cout.setf(ios::showbase);
    cout << 34;		//042
    cout.setf(ios::hex, ios::basefield);
    cout << 34;		//0x22
    
    cout.unsetf(ios::showbase);
    cout << 34;		//22
    
    cout.setf(ios::dec, ios::basefiled);
    
    cout.width(10);
    cout << 26 << endl;	//        26
    cout.setf(ios::left, ios::adjustfield);	//26
    
    //浮点数
    cout.setf(ios::scientific, ios::floatfield);
    cout << 340.1 << endl;	//3.401000e+002
    cout.setf(ios::fixed, ios::floatfield);
    cout << 340.1 << endl;	//340.100000
    cout.precision(3);
    cout << 340.1 << endl;	/340.100
        
    int i;
    cin.setf(ios::hex, ios::basefield);
    cin >> i;	//Enter: 12
    //	i==18
    ios::fmtflags f = cout.flags();
    cout.flags(ios::oct|ios::showbase);
    
    //用来非格式化IO的成员函数
    ifstream inf("MyLog.txt");
    char buf[80];
    inf.get(buf, 80);	//读最多80个字符
    Inf.getline(buf, 80);	//读最多80个字符,或直到'
    '
    inf.read(buf, 20);	//读20字符
    inf.ignore(3);
    inf.peek();		//返回string最顶端的字符
    inf.unget();	//将最后一个读的字符放回流中 inf.putback('z');
    inf.get();		//读一个字符
    inf.gcount();	//返回上次非格式化读的字符数
    
    ofstream of("MyLog.txt");
    of.put('c');
    of.write(buf, 6);	//写buf的前6个字符
    of.flush();	//刷新输出
    

    操纵符Manipulators

    ostream& endl(ostream& sm) {
        sm.put('
    ');
        sm.flush();
        return sm;
    }
    
    ostream& ostream::operator<<(ostream& (*func)(ostream&)) {
        return (*func)(*this);
    }
    
    cout << "Hello" << endl;  //endl是函数
    
    cout << ends;	// ''
    cout << flush;	//
    cin >> ws;	//读取并丢弃空白
    cout >> setw(8) << left << setfill('_') << 99 << endl;	//99______
    
    cout << hex << showbase << 14;	//0xe
    

    流缓冲

    //	格式化数据  -- 流
    //	将数据与外部设备交流  -- 流缓冲
    cout << 34;
    streambuf* pbuf = cout.rdbuf();
    
    ostream myCout(pbuf);
    myCout << 34;	// 34输出到标准输出stdout
    
    muCout.setf(ios::showpos);	//显示符号
    myCout.width(20);
    myCout << 12 <<endl;	//                 +12
    cout << 12 << endl;		//12
    适合临时修改数据格式,不想修改cout,可能其他人在用
    
    ofstream of("MyLog.txt");
    steambuf* origBuf = cout.rdbuf();
    cout.rdbuf(of.rdbuf());
    cout << "Hello"	<< endl;	//MyLog.txt has "Hello" 重定向
    
    cout.rdbuf(origBuf);
    cout << "Goodbye" << endl;	//stdout: Googbye
    
    // 流缓冲迭代器
    istreambuf_iterator<char> i(cin);
    osteambuf_iterator<char> o(cout);
    while (*i != 'x') {
        *o = *i;
        ++o;
        ++i;
    }
    
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(), ostreambuf_iterator<char>(cout));
    

    字符串流

    stringstream ss;	// 没有IO操作的流
    
    ss << 89 << "Hex: " << hex << 89 << " Oct: " << oct << 89;
    cout << ss.str() << endl;	// 89 Hex: 59 Oct: 131
    
    int a, b, c;
    string s1;
    
    ss >> hex >> a;	//一个token一个token读取,以空格tab和换行分隔,a==137
    ss >> s1;	// s1: "Hex:"
    ss >> dec >> b;	// b==59
    ss.ignore(6);	//忽略接下来6个字符
    ss >> oct >> c;	// c==89
    

    自定义类中使用流

    using namespace std;
    
    struct Dog {
        int age_;
        string name_;
    };
    
    ostream& operator<<(ostream& sm, const Dog& d) {
        sm << "My name is " << d.name_ << " and my age is " << d.age_ << endl;
        return sm;
    }
    
    istream& operator>>(istream& sm, Dog& d){
        sm >> d.age_;
        sm >> d.name_;
        return sm;
    }
    
    int main() {
        Dog d{2, "Bob"};
        cout << d;
        
        cin >> d;
        cout << d;
    }
    
  • 相关阅读:
    668. Kth Smallest Number in Multiplication Table
    658. Find K Closest Elements
    483. Smallest Good Base
    475. Heaters
    454. 4Sum II
    441. Arranging Coins
    436. Find Right Interval
    410. Split Array Largest Sum
    392. Is Subsequence
    378. Kth Smallest Element in a Sorted Matrix
  • 原文地址:https://www.cnblogs.com/logchen/p/10204019.html
Copyright © 2011-2022 走看看