zoukankan      html  css  js  c++  java
  • c/c++ 输入输出缓冲区

    关于缓冲区的详细介绍,请参考

    C++编程对缓冲区的理解

    CPP的输入输出流和缓冲区

    c++输出缓冲区刷新

     

    (1)c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 对象和 and cstdio流是同步的,同步关系如下:

    image

    同步即表明我们可以在程序中混合用cout和printf或其他对应的流对。可以用std::ios_base::sync_with_stdio(false)来取消这种同步,取消后,如下程序中cout和printf就不是按照预期的顺序输出

    std::ios_base::sync_with_stdio(false);
        for(int i = 0 ; i < 10; i++)
        {
            cout<<"1 ";
            printf("2 ");
        }

    windows下输出是:2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1

    linux下是:1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2

    正是因为这种同步,所以cin、cout比scanf、printf速度要慢,如果我们在使用cin、cout输入输出前加一句std::ios_base::sync_with_stdio(false),其实速度和scanf、printf差不多。速度对比可以参考探寻C++最快的读取文件的方案

     

     

    (2)以下程序

    for(int i = 0 ; i < 10; i++)
        {
            cout<<"1 ";
        }
        while(1);

     

    以上程序在windows下立即输出10个1,linux下不输出。说明windows下默认cout是无缓冲的(window可以通过cout<<stdout->bufsiz来查看缓冲区大小,windows不能这么做),linux下是有缓冲的。(cout换成printf也是一样)

     

    (3)我们可以通过函数setbufsetvbuf 自己设置输入输出流的缓冲区,需要注意的是不管程序中申请的的缓冲区实际大小为多少,setbuf都将缓冲区设置的大小为BUFSIZ(这个宏在windows下是512,ubuntu下是1024), setvbuf则可以设置缓冲区大小以及缓冲区的模式(行缓冲、全缓冲、无缓冲),需要注意的是这两个函数设置的是c的输入输出缓冲区,因为c++和c的缓冲区是同步的,所有该函数会对c++有影响                         本文地址

    char buf[1024];

    setbuf(stdout, buf);

    for(int i = 0 ; i < 10; i++)
    {
    cout<<"1 ";
    }
    while(1);

    此时windows和linux下都没有输出1

     

    (4)因为默认情况下,cin是和cout绑定的,cin 会刷新cout的缓冲区,可以用函数cin.tie(0)来解绑定。所以在上面代买的基础上,在while(1); 前面加上:int a; cin>>a; 此时所有的1就可以输出了。

    char buf[1024];

    setbuf(stdout, buf);

    for(int i = 0 ; i < 10; i++)
        {
          cout<<"1 ";
        }

    int a; cin>>a;
    while(1);

     

    加上cin.tie(0)后,以下的代码没有输出1,因为cin已经和cout解绑定了,cin刷新不了cout的缓冲区。(可以cin.tie(&cout)来绑定,注意cout没有tie方法)

    char buf[1024];

    setbuf(stdout, buf);

    cin.tie(0);

    for(int i = 0 ; i < 10; i++)
        {
           cout<<"1 ";
        }

    int a; cin>>a;
    while(1);

     

    有点奇怪的是以下代码还是会输出1,即默认缓冲区的情形下,接触绑定没有产生效果。stackoverflow是这样解释的

    cin.tie(0);

    for(int i = 0 ; i < 10; i++)
    {
    cout<<"1 ";
    }

    int a; cin>>a;
    while(1);

     

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3733243.html

  • 相关阅读:
    读写INI配置文件
    log4net自动邮件
    C#往SQLServer中插入大数据
    C#反射
    正则表达式
    收发邮件
    读写文本
    Selenium—选择框的相关操作(单选框、多选框、复选框、下拉框)
    Selenium—iframe的操作
    Selenium—web元素的操作
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3733243.html
Copyright © 2011-2022 走看看