通常,通过使用缓冲区可以更高效地处理输入和输出。缓冲区是用作中介的内存块,它是将信息从设备传输到程序或从程序传输给设备的临时存储工具。通常,像硬盘驱动器这样的设备以512字节(或更多)的块为单位来传输信息,而程序通常每次只能处理一个字节的信息。缓冲区帮助匹配这两种不同的信息传输速率。例如,假设程序要计算记录在硬盘文件中的金额。程序可以从文件中读取一个字符,处理它,再从文件中读取下一个字符,再处理,以此类推。从硬盘文件冲每次读取一个字符需要大量的硬件活动,速度非常慢。缓冲方法则从硬盘上读取大量信息,将这些信息存储在缓冲区中,然后每次从缓冲区里读取一个字节。输出时,程序首先填满缓冲区,然后把整块数据传输的给硬盘,并清空缓冲区,以备下一批输出使用。这被称为刷新缓冲区。

键盘输入每次提供一个字符,因此这中情况下,程序无需缓冲区来帮助匹配不同的数据传输速率。然而,对键盘输入进行缓冲可以让用户在将输入传输给程序之前返回并更正。c++程序通常在用户按下回车时刷新输入缓冲区。对于屏幕输出,c++程序通常在用户发送换行符时刷新缓冲区。程序也可能会在其他情况下刷新输入

由于ostream类对cout对象出的的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。

但不一定。在屏幕输出时,程序不必等到缓冲区被填满。例如,将换行符发送到缓冲区后,将刷新缓冲区。另外,多数c++实现都会在输入即将发生时刷新缓冲区。例如

cout<<"aaaaa";
int n;
cin>>n;

程序期待输入这一事实,将导致它立刻显示cout信息(即“aaaaa”),即使输出字符串中没有换行符。如果没有这一特性,程序将等待输入,而无法通过cout信息来提示用户。

还可以使用两个控制符来强行进行刷新flush 和 endl

cout<<"asd"<<flush;    //刷新缓冲区
flush(out); //刷新缓冲区
cout<<""sdf"<<endl; //刷新缓冲区并插入一个换行符

 

一般来说,有以下几种操作会刷新缓冲区:

  • cout被析构
  • 缓冲区满
  • 使用操纵符主动刷新,例如endl,fflush
  • 使用unitbuf操纵符设置流的内部状态,使得每次向流中插入字符都会刷新流
  • 使用cin读取字符串

但当测试以下代码时:

#include<iostream>
using namespace std;
int main()
{
cout<<"aaa";
while(1);
return 0;
}

虽然不满足上述操作中的任何一个,但字符串aaa仍被输出。vs,g++上均是如此。
经查找资料了解到:当系统空闲时(还有种说法是长时间无输入时)缓冲区会自动刷新。当然这种刷新只是一种“请求”,并不能保证刷新,会不会刷新完全看系统心情
所以,并非未刷新缓冲区就输出了字符串,而是系统比较闲,所以顺手帮你刷新了缓冲区。但要想保证在该输出的地方输出,还是安安心心使用endl或flush吧

http://www.cnblogs.com/cknightx/p/6992417.html

c++ Primer Plus

c++缓冲区------c++ Primer Plus的更多相关文章

  1. 总结c++ primer中的notes

    转载:http://blog.csdn.net/ace_fei/article/details/7386517 说明: C++ Primer, Fourth Edition (中英文)下载地址:htt ...

  2. C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题

    今天在做C++ Primer习题的14.11时,印象中应该挺简单的一题,结果却费了很长时间. 类定义: typedef string Date; class CheckoutRecord{ publi ...

  3. 《C++ Primer》读书笔记—第一章 开始

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.一个函数的定义包含四个部分:返回类型(retur ...

  4. C++primer拾遗(第一章:开始)

    本系列将总结正在阅读的C++primer这本书中值得注意又容易忘记的知识点. 1. 当return语句包括一个值时,次返回值的类型必须与函数返回类型相同. 2. 操纵符 endl.写入该符号的效果是: ...

  5. C++Primer第五版学习笔记

    <C++ Primer>Learning Note 程序实例下载地址:http://www.informit.com/title/0321714113 第一章            开始 ...

  6. c++ primer 笔记 (一)

    昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统   操作系统通过main函数返回的值来确定程序是否成功执行 ...

  7. C语言清空输入缓冲区

    来源:http://blog.csdn.net/guanyasu/article/details/53153705 https://zhidao.baidu.com/question/5241738. ...

  8. 《C++ Primer》第II部分:C++标准库

    <C++ Primer>第II部分:C++标准库 前言 把<C++ Primer>读薄系列笔记.本篇为第II部分C++标准库,包含全书第8-12章重难点: IO库 顺序容器 范 ...

  9. cin.get()、流和缓冲区

    大家好,这是我在CSDN的第一篇博客.我是一名学习GIS专业的大学生.我从小开始喜欢编程,可是到现在编程水平却长进不大,依然是菜鸟一个.究其原因,虽然这些年乱七八糟的东西学过不少,但是总的来说还是基础 ...

随机推荐

  1. tp5下通过composer实现日志记录功能

    tp5实现日志记录 1.安装 psr/log composer require psr/log 它的作用就是提供一套接口,实现正常的日志功能! 我们可以来细细的分析一下,LoggerInterface ...

  2. 腾讯云搭建php环境

    1.安装搭建论坛必要的软件 apache  php  mysql CentOS系统我们可以直接使用 yum install 的方式进行软件安装,腾讯云有提供软件安装源,是同步CentOS官方的安装源, ...

  3. maven学习4 使用Maven构建Spring项目

    1. 新建一个Web项目 参考之前的博客 2.修改 pom.xml,添加Spring依赖 <project xmlns="http://maven.apache.org/POM/4.0 ...

  4. C++获取Lua全局变量和执行Lua多参数多返回值函数

    C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...

  5. C#使用protobuf

    C# protobuf的使用方法 通过.proto文件导出C#支持的.cs类文件 protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.googl ...

  6. curl 命令参数

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Cache-Control: ...

  7. Oracle T4-2用jumpstart方式安装Solaris10

    在安装过程中遇到了2个问题 1) 安装时无法识别硬RAID磁盘 T4-2的2块本地盘做了硬RAID,用jumpstart安装时无法识别硬RAID磁盘,报错信息如下: {0} ok boot net - ...

  8. 2014蓝桥杯B组初赛试题《李白打酒》

    题目描述: 话说大诗人李白,一生好饮.幸好他从不开车.     一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒.     逢店加一倍,遇花喝一斗.     这一路上 ...

  9. 2014蓝桥杯B组初赛试题《啤酒和饮料》

    题目描述: 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.     我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒.     注意:答案是一个整数.请通过 ...

  10. JavaScript(JS)实现省市联动选择下拉列表

    在开发一个应用的时候需要用刀省市联动的下拉列表,网上找到不少.但是要么太复杂,难以修改:要么根本就用不了,最后自己在一个示例中提取出数据,然后自己写了一个,简单易懂,适合新手... 代码如下: Pro ...