当前位置 博文首页 > 东南亚季风:C++:标准I/O流

    东南亚季风:C++:标准I/O流

    作者:东南亚季风 时间:2021-01-30 18:36

    标准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()的作用是通过设置格式标志来控制输出形式

    • 1.使用控制符控制输出格式
      控制符 作用
      dec 设置整数的基数为10
      hex 设置整数的基数为16
      oct 设置整数的基数为8
      setbase(n) 设置整数的基数为n(n只能是16,10,8之一)
      setfill(c) 设置填充字符c,c可以是字符常量或字符变量
      setprecision(n) 设置实数的精度为n位.在以一般十进制小数形式输出时,n代表有效数字.在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数.
      setw(n) 设置字段宽度为n位.
      setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示.
      setiosflags(ios::scientific) 设置浮点数以科学计数法(即指数形式)显示.
      setiosflags(ios::left) 输出数据左对齐.
      setiosflags(ios::right) 输出数据右对齐.
      setiosflags(ios::shipws) 忽略前导的空格.
      setiosflags(ios::uppercase) 在以科学计数法输出E和十六进制输出字母X时,以大写表示.
      setiosflags(ios::showpos) 输出正数时,给出“+”号.
      resetiosflags 终止已设置的输出格式状态,在括号中应指定内容.
    • 2.用流对象的成员控制输出格式
      流成员函数 与之作用相同的控制符 作用
      precision(n) setprecision(n) 设置实数的精度为n位.
      width(n) setw(n) 设置字段宽度为n位.
      fill(c) setfill(c) 设置填充字符c.
      setf( ) setiosflags( ) 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同.
      ubsetf( ) resetiosflags( ) 终止已设置的输出格式状态.
      cout.width(10);
      cout.setf(ios::hex);
    • 3.设置格式状态的格式标志
      格式标志 作用
      ios::left 输出数据在本域宽范围内左对齐
      ios::right 输出数据在本域宽范围内右对齐
      ios::internal 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充
      ios::dec 设置整数的基数为10
      ios::oct 设置整数的基数为8
      ios::hex 设置整数的基数为16
      ios::showbase 强制输出整数的基数(八进制以0打头,十六进制以0x打头)
      ios::showpoint 强制输出浮点数的小点和尾数0
      ios::uppercase 在以科学计数法输出E和十六进制输出字母X时,以大写表示
      ios::showpos 输出正数时,给出“+”号.
      ios::scientific 设置浮点数以科学计数法(即指数形式)显示
      ios::fixed 设置浮点数以固定的小数位数显示
      ios::unitbuf 每次输出后刷新所有流
      ios::stdio 每次输出后清除stdout,stderr
    	//成员方法的方式
    	int number = 10;
    	cout << number << endl;
    	cout.unsetf(ios::dec); //卸载当前默认的的10进制输出方式
    	cout.setf(ios::oct); //八进制输出
    	cout.setf(ios::showbase);
    	cout << number << endl;
    	cout.unsetf(ios::oct); //卸载8进制
    	cout.setf(ios::hex);
    	cout << number << endl;
    
    	cout.width(10);
    	cout.fill('*');
    	cout.setf(ios::left);
    	cout << number << endl;
    
    
    	//通过控制符
    	int number2 = 10;
    	cout << hex
    		<< setiosflags(ios::showbase)
    		<< setw(10)
    		<< setfill('*')
    		<< setiosflags(ios::left)
    		<< number2
    		<< endl;
    /*
    结果:
    10
    012
    0xa
    0xa*******
    0xa*******
    */
    
    bk
    下一篇:没有了