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)我们可以通过函数setbuf 和 setvbuf 自己设置输入输出流的缓冲区,需要注意的是不管程序中申请的的缓冲区实际大小为多少,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);






本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3733243.html,如需转载请自行联系原作者

目录
相关文章
|
机器人 Linux C语言
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
C语言, C++ IO 总结. 一篇文章帮你透析缓冲区存在的意义, C, C++ IO的常见用法
|
存储 编译器 C++
清除 C/C++ 中的输入缓冲区
临时存储区称为缓冲区。所有标准输入和输出设备都包含一个输入和输出缓冲区。在标准 C/C++ 中,流被缓冲,例如在标准输入的情况下,当我们按下键盘上的键时,它不会发送到您的程序,而是由操作系统缓冲直到时间分配到那个程序。
311 0
|
缓存 网络协议 Linux
C/C++零散知识点汇总之缓冲区
C/C++零散知识点汇总之缓冲区
|
Linux C++ 缓存
C/C++中printf/cout 计算顺序与缓冲区问题
1.printf/cout在同一个语句中都是从右向左计算的。 看如下的代码: 1 #include 2 int main() 3 { 4 int i=0; 5 printf("%d %d",i++,i++); 6 printf(" %d",i++); 7 return 0; 8 } 输出结果: 1 0 2 (第5行,先计算右边的i++,再计算左边的i++。
1409 0
|
C++ Windows
[c/c++]小议几个写缓冲区的函数
1. strncpychar *strncpy(char *dest, char *src, size_t num); strcpy没得说,它自动补NULL,而且你得给他足够大的空间,一般是读src的长度n然后动态分配(n + 1)大小的内存。
1049 0
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
94 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
172 0
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
183 12
|
7月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
131 16