STL基础--流

介绍

// cout: 全局ostream对象,(typedef basic_ostream<char> ostream)
// <<: ostream& ostream::operator<< (string v);
// endl: '\n' + 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个字符,或直到'\n'
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('\n');
    sm.flush();
    return sm;
}

ostream& ostream::operator<<(ostream& (*func)(ostream&)) {
    return (*func)(*this);
}

cout << "Hello" << endl;  //endl是函数

cout << ends;   // '\0'
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;
}

猜你喜欢

转载自www.cnblogs.com/logchen/p/10204019.html