• 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;
    }
    
  • 相关阅读:
    2014.7建兰NOIP模拟Day1 Running
    简单的数论函数模板
    二分图匹配的匈牙利算法
    手算平方根
    ...
    hdu 5396 Expression(区间DP+组合数)
    hdu 5693 D Game(区间DP)
    hdu 5151 Sit sit sit(区间dp+排列组合)
    hdu 4570 Multi-bit Trie(dp)
    hdu 2855 Fibonacci Check-up (矩阵)
  • 原文地址:https://www.cnblogs.com/logchen/p/10204019.html
Copyright © 2020-2023  润新知