标准I/O对象:cin,cout,cerr,clog
cout; //全局流对象 输出数据到显示器
cin; //cerr没有缓冲区 clog有缓冲区
cerr; //标准错误 输出数据到显示器
clog; //标准日志 输出数据到显示器
一、标准输入流 cin.get()//一次只能读取一个字符
char ch; while ((ch = cin.get()) != EOF){//EOF就是键盘Ctrl+z,常被作为结束的标志 cout << ch << endl; } /* 结果: cin c i n */ cin.get(一个参数)//读一个字符
char ch2; cin.get(ch2); //读取一个字符 cout << ch2 << endl; /* 结果: cin c */ cin.get(三个参数)//可以读字符串
char buf[256] = { 0 }; cin.get(buf, 256); //从缓冲区读一个字符串 cout << buf; /* 结果: 输入:cin.get() 111 输出:cin.get() 111 */ cin.getline() char buf[256] = { 0 }; cin.getline(buf, 256); //读取一行数据 cout << buf; /* 输入:cin.getline() cin.get() 输出:cin.getline() cin.get() */ cin.ignore()有时候你只想取缓冲区的一部分,而舍弃另一部分,这是就可以使用cin.ignore(),其使用方法是:
cin.ignore(int intExp, char chExp);
其中intExp 是一个整型表达式,也可以是一个整型数值,这个数值表示在一行中忽略的字符的最大数目,比如说intExp=100;还有一个参数chExp,是一个字符表达式。表示如果遇到一个字符值等于chEXP,那么就停止ignore(),如果ignore100个字符之后还没遇到值等于chEXP的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符数。
char ch; cin.get(ch); //从缓冲区要数据 阻塞 cout << ch << endl; cin.ignore(10); //忽略当前字符 从缓冲区取走了 cin.get(ch); cout << ch << endl; /* 结果: 输入:asdfghjklzxcvbnm 输出:a c */ cin.peek()此函数返回输入流中的下一个字符,但是并不将该字符从输入流中取走——相当于只是看了一眼下一个字符,因此叫 peek。
cin.peek() 不会跳过输入流中的空格、回车符。在输入流已经结束的情况下,cin.peek() 返回 EOF。
在输入数据的格式不同,需要预先判断格式再决定如何输入时,peek() 就能起到作用。
cout << "请输入数组或者字符串:" << endl; char ch; ch = cin.peek(); //偷窥一下缓冲区,返回第一个字符 if (ch >= '0' && ch <= '9') { int number; cin >> number; cout << "您输入的是数字:" << number << endl; } else { char buf[256] = { 0 }; cin >> buf; cout << "您输入的是字符串:" << buf << endl; } /* 结果: 请输入数组或者字符串: acdsf 您输入的是字符串:acdsf */ cin.putback()iostream是一个类,有自己的buffer。你每次cin>>a,它就把buffer减一,放到a中去。cin.putback(a)就是把a的内容放回buffer中。
cout << "请输入字符串或者数字:" << endl; char ch; cin.get(ch); //从缓冲区取走一个字符 if (ch >= '0' && ch <= '9') { //ch放回到缓冲区 cin.putback(ch); int number; cin >> number; cout << "您输入的是数字:" << number << endl; } else { cin.putback(ch); char buf[256] = { 0 }; cin >> buf; cout << buf << endl; } /* 结果: 请输入字符串或者数字: 33333 您输入的是数字:33333 */ 二、标准输出流 cout.flush()所要输出的内容会先存入缓冲区,而 cout.flush()的作用正是强行将缓冲区的数据清空。这样在关闭读写流时,就不会丢失数据。
cout.put()cout.put()专用于向输出流缓冲区中添加单个字符,
cout.write()write() 成员方法专用于向输出流缓冲区中添加指定的字符串,初学者可以简单的理解为输出指定的字符串。其语法格式如下:
ostream&write(const char * s,streamsize n);
其中,s 用于指定某个长度至少为 n 的字符数组或字符串;n 表示要输出的前 n 个字符。
cout << "hello world" <<endl; //cout.flush(); cout.put('h').put('e').put('l') << endl; cout.write("hello Zhaosi!", strlen("hello Zhaosi!")); /* 结果: hello world hel hello Zhaosi! */ cout.width()控制符int width()将用来调整字段的宽度,因为width是成员函数,所以要通过对象来调用,比如cout.width()将显示当前的字段宽度,默认为0,而cout.width(3)将把字段宽度设定为3。注意C++容纳字段的方式为给字段分配刚好合适的宽度来容纳字段,所以C++中默认的字段宽度为0,以适合于所有的字段。
width的默认对齐方式为右对齐,即如果cout.width(12)如果字段没有这么宽,则将在字段的左边填以空格来达到12个字段的宽度。
还要注意的是width只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值,比如cout.width(12); cout<<2<<3;则输出2时会以12字段的宽度显示,但显示3时就会以默认的方式显示了。
int width()调用他时将会反回上一次的字段宽度的值。
cout.fill()成员函数fill()可以用来改变填充的字符,比如cout.fill('*'),使用*填充空白部分。
但是千万要注意:fill函数在设置后将一直有效,除非被重新设定。
而且cout.fill('*')会返回设置'*'之前的fill字符' ' 所以如果用cout<<cout.fill('*')就会输出这个空格
cout.setf(标记)cout.setf()的作用是通过设置格式标志来控制输出形式