cout, cerr, clog的区别和windows下的重定向
2015-07-02 17:15
351 查看
1、cout,cerr,clog的区别
《C++ Primer》第四版中解释为:标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in)的 istream 类型对象。这个对象也称为标准输入。处理输出时使用命名为 cout(读作 see-out)的 ostream 类型对象,这个对象也称为标准输出。标准库还定义了另外两个 ostream 对象,分别命名为 cerr 和 clog(分别读作“see-err”和“see-log”)。cerr
对象又叫作标准错误,通常用来输出警告和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行程序的窗口联系起来。这样,当我们从cin 读入时,数据从执行程序的窗口读入,当写到 cin、cerr 或 clog 时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或输出流的方法。利用重定向可以将这些流与所选择的文件联系起来。
查阅网上的一些资料,基本区别如下:
cerr(无缓冲)---------------标准错误,发送给它的内容立即被输出
clog(有缓冲)---------------标准错误,缓冲区满时输出
cout(有缓冲)---------------标准输出
三个都是ostream类定义的输出流对象,
cout是在终端显示器输出, cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据, 当向cout流插入一个endl, 不论缓冲区是否漫了,都立即输出流中所有数据, 然后插入一个换行符.
cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出。
它们三个在windows平台下都可以重定向输出。
关于缓冲区:
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。
那么什么是刷新缓冲区呢?到网上找到资料如下:
以缓冲方式打开一个文件时,往文件里写几个字节,一般不会立即真正把这几个字节写入文件,只有当缓冲区满时才真正写盘。如果想在缓冲区满之前写盘保存,可以做冲刷缓冲区动作。
下列行为引发冲刷动作:
1)缓冲区满时;
2)行输出时遇endl,cerr或cin时;
3)执行冲刷函数;
4)关闭文件。
2、重定向
重定向命令行命令:
cmd > file 把cout重定向到file文件中;
cmd >> file 把cout重定向到file文件中(追加);
cmd 1> fiel 把cout重定向到file文件中;
cmd > file 2>&1 把cout、cerr和clog一起重定向到file文件中;
cmd 2> file 把cerr、clog 重定向到file文件中;
cmd 2>> file 把cerr、clog重定向到file文件中(追加);
cmd >> file 2>&1 把cout、cerr和clog一起重定向到file文件中(追加);
windows下编写下面程序
// test.cpp
#include<iostream>
using namespace std;
int main ()
{
cout << "cout" << endl;
cerr << "cerr" << endl;
clog << "clog" << endl;
cout << "cout2" << endl;
return 0
}
命令行下执行:
1.test >file.txt
(file文件结果:cout
cout2
)
2.test >>file.txt
(file文件结果:cout
cout2
cout
cout2
)
3.test 2>file.txt
(file文件结果:cout
cerr
clog
cout2
)
《C++ Primer》第四版中解释为:标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in)的 istream 类型对象。这个对象也称为标准输入。处理输出时使用命名为 cout(读作 see-out)的 ostream 类型对象,这个对象也称为标准输出。标准库还定义了另外两个 ostream 对象,分别命名为 cerr 和 clog(分别读作“see-err”和“see-log”)。cerr
对象又叫作标准错误,通常用来输出警告和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行程序的窗口联系起来。这样,当我们从cin 读入时,数据从执行程序的窗口读入,当写到 cin、cerr 或 clog 时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或输出流的方法。利用重定向可以将这些流与所选择的文件联系起来。
查阅网上的一些资料,基本区别如下:
cerr(无缓冲)---------------标准错误,发送给它的内容立即被输出
clog(有缓冲)---------------标准错误,缓冲区满时输出
cout(有缓冲)---------------标准输出
三个都是ostream类定义的输出流对象,
cout是在终端显示器输出, cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据, 当向cout流插入一个endl, 不论缓冲区是否漫了,都立即输出流中所有数据, 然后插入一个换行符.
cerr流对象是标准错误流,指定为和显示器关联,和cout作用差不多
clog流也是标准错误流,作用和cerr一样,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl时才输出。
它们三个在windows平台下都可以重定向输出。
关于缓冲区:
endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。
程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。
那么什么是刷新缓冲区呢?到网上找到资料如下:
以缓冲方式打开一个文件时,往文件里写几个字节,一般不会立即真正把这几个字节写入文件,只有当缓冲区满时才真正写盘。如果想在缓冲区满之前写盘保存,可以做冲刷缓冲区动作。
下列行为引发冲刷动作:
1)缓冲区满时;
2)行输出时遇endl,cerr或cin时;
3)执行冲刷函数;
4)关闭文件。
2、重定向
重定向命令行命令:
cmd > file 把cout重定向到file文件中;
cmd >> file 把cout重定向到file文件中(追加);
cmd 1> fiel 把cout重定向到file文件中;
cmd > file 2>&1 把cout、cerr和clog一起重定向到file文件中;
cmd 2> file 把cerr、clog 重定向到file文件中;
cmd 2>> file 把cerr、clog重定向到file文件中(追加);
cmd >> file 2>&1 把cout、cerr和clog一起重定向到file文件中(追加);
windows下编写下面程序
// test.cpp
#include<iostream>
using namespace std;
int main ()
{
cout << "cout" << endl;
cerr << "cerr" << endl;
clog << "clog" << endl;
cout << "cout2" << endl;
return 0
}
命令行下执行:
1.test >file.txt
(file文件结果:cout
cout2
)
2.test >>file.txt
(file文件结果:cout
cout2
cout
cout2
)
3.test 2>file.txt
(file文件结果:cout
cerr
clog
cout2
)
相关文章推荐
- 如何获取手机上网时的外部网络的IP地址
- 渲云客户端提交渲染完了以后显示去客户端查看了,可是客户端没有,咋回事?
- cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)
- 安装freeswitch碰到的问题
- Android三种基本的加载网络图片方式
- 欢迎来到Flask的世界
- XCode Playground Overview
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- Java中事务的处理
- JAVA代码规范
- 正则表达式
- SQL Server中DateTime与DateTime2的区别
- Linux系统手动格式化大于2TB数据盘操作指引
- percona XtraBackup安装
- 以太网自适应
- 每天一个linux命令之umount命令
- 2.4.5 用NPOI操作EXCEL--插入图片
- 客户端的安装与功能介绍?
- 脚本判断hdfs上的文件是否存在
- 统计内网机器网络流量的方案