c++ primer plus 第二章 \n与endl在输出上的区别

    在书上看到如下一段话:

    一个差别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上):而使用“\n”不能提供这样的保证,这意味着在有些系统中,有时可能在您输入信息后才会出现提示。

    理解:\n只代表换行的转义字符,endl除了代表换行,还紧跟着刷新缓冲区。

    见如下代码:

////////////////////////////////////////////////////////////
#include <iostream>
//this header is for vs2012
//#include <chrono>
//#include <thread>
#include <fstream>
#include "windows.h"

int main()
{
    std::ofstream ofile("e:\\a.txt");
    
    // "hello, file"字符串输出到文件流对象ofile中的缓冲区中
    //ofile << "hello, file";
    ofile << "hello, file" << std::endl;
    
    // 程序暂停执行30秒,在程序暂停期间打开e:\a.txt文件发现里面内容为空
    // 可以证明文件流对象中缓冲区的内容还为输出到磁盘文件中
    // 如果加上std::endl,可以发现文件内容已有hello, file字符串,说明
    // std::endl操纵符是强制刷新缓冲区内容
    //std::this_thread::sleep_for(std::chrono::seconds(30));
    Sleep(30000);
    
    // 关闭文件流对象
    ofile.close();
    return 0;
}

 

以上注释已经很明了了。大家可以运行试试。

缓冲区的理解:

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

posted @ 2013-10-31 12:00  榕树下的愿望  阅读(308)  评论(0编辑  收藏  举报