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