关于C++中的重定位
"标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,而clog对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行窗口联系起来,这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr、clog时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出流的方法。利用重定向可以将这些流与所选择的文件联系起来" ---------------------C++ Prime
重新开始看了这本书,决定哪里看不懂的就扣一下。如上文中的重定位。
翻阅其他资料,做记录,以便以后复习。
1.cout cerr clog都是ostream对象。cout clog 和 cerr 的区别在于有没有经过缓冲区输出以及能不能被重定位
cout是在终端显示器输出,cout流在内存中有自己对应的一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否满了,都立即输出流中所有数据,刷新终端,一般是屏幕,然后插入一个换行符。cout还可以输出重定向到文件(实际上就是一个管道的一头连输出流,另一头连文件输入流)。当缓冲区满了,但是还没有被消耗的情况下会出现被阻塞的问题。
cerr是指定为和显示器关联的,cerr没有缓冲区,直接刷新终端。并且一般只能输出到终端,不能被重定向。(但下面例子中的外部重定向可以实现cerr的重定向。)
tip:c是console的意思啊~~~
2.重定向的实现
#include <iostream>
int main()
{
std::cout << "cout" <<std::endl;
std::cerr << "cerr" <<std::endl;
std::clog << "clog" <<std::endl;
return 0;
}
先通过编译器生成以上的 Cprogram.exe。再在cmd下运行此程序:
命令行操作符>用于对cout进行重定向,操作符1>对cout进行重定向,操作符2>对cerr和clog进行重定向。

三次中Cprogram.log中 分别是cout;cout;cerr clog。 即分别是终端中缺省的哪些输出内容,因其被重定向到了Cprogram.log中。
以上是操作系统重定向,称为外部重定向;
下面的都是 内部重定向的实现
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("main.cpp"); //从文件中读取的类型 in 用main.cpp初始化in
cout<<in.rdbuf()<<endl; //rdbuf()是一个成员函数,文件的全部内容
return 0;
}
输出内容为就是main.cpp里面的内容:

C++中rdbuf重定向流的经典例子:
int main()
{
ofstream file("cjf.txt");
streambuf *log = clog.rdbuf(file.rdbuf());
//每个输入输出流对象包含一个成员函数rdbuf(),它返回的是一个指向对象streambuf的指针.通过这个指针可以对streambuf对象进行存取.
//写了这句以后,下面遇到clog输出,就输出到cjf.txt中了,具体就是通过log对象指针来重定向的吧
cout << "cout" <<endl;
cerr << "cerr" <<endl;
clog << "clog" <<endl;
clog.rdbuf(log);//重定位结束。下面的you are 会输出在终端上 而非cjf.txt中
clog << "you are" <<endl;
system("pause");
//同理 foo.txt中的内容是 :重定向的内容.终端屏幕无输出。
ofstream log("foo.txt");
streambuf * oldbuf = cout.rdbuf(log.rdbuf());
cout << "重定向的内容/n" ;
return 0;
}
重定向clog对象到cjf.txt文件对象,同样cout,cerr也可以进行同样的重定向
可以利用rdbuf()重新指向到流设备(文本文件、串口等等)。
整理着整理着又看到了第8章 标准IO库
这篇文章是iostream 的用途与局限:http://www.cppblog.com/Solstice/archive/2011/07/17/151224.html
关于C++中的重定位的更多相关文章
- WindowsPE权威指南-PE文件头中的重定位表
PE加载的过程 任何一个EXE程序会被分配4GB的内存空间,用户层处理低2G的内存,驱动处理高2G的内存. 1.双击EXE程序,操作系统开辟一个4GB的空间. 2.从ImageBase决定了加载后的基 ...
- 【图片+代码】:GCC 链接过程中的【重定位】过程分析
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- ELF Format 笔记(十)—— 重定位(relocation)
ilocker:关注 Android 安全(新手) QQ: 2597294287 重定位就是把符号引用与符号定义链接起来的过程,这也是 android linker 的主要工作之一. 当程序中调用一个 ...
- PE结构之重定位表
什么是重定位: 重定位就是你本来这个程序理论上要占据这个地址,但是由于某种原因,这个地址现在不能让你占用,你必须转移到别的地址,这就需要基址重定位.你可能会问,不是说过每个进程都有自己独立的虚拟地址空 ...
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...
- u-boot移植(四)---修改前工作:代码流程分析3---代码重定位
一.重定位 1.以前版本的重定位 2.新版本 我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址.我们要修改地址,则 ...
- PE文件 03 重定位表
0x01 重定位表结构 重定位表是由数据目录表中的第六个成员指出的: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; D ...
- 【旧文章搬运】PE重定位表学习手记
原文发表于百度空间,2008-11-02========================================================================== 先定义一下 ...
- linux从head.s到start_kernelstart_kernel之---内核解压到重定位分析
一: arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号 ...
随机推荐
- 美团点评2017校招研发offer面经
2017届的校招早早就结束了,抽出时间做个记录. 职位:后台开发工程师 岗位职责: 如果你热爱编程,这里给你平台用代码改变世界: 如果你乐于挑战,这里有用户和商家五花八门的需求和苛刻的系统运行环境在等 ...
- this和$(this)
this指的是javascript对象而$(this)就是就jquery对象 jQuery.prototype.test=function(){ this.css("color", ...
- Vs2015 Ef 连接Oracle 出现OracleInternal.Common.ConfigBaseClass 的解决办法
如果配置没问题的话,就是 Oracle.ManagedDataAccess 在全局程序集的版本问题 解决方法方法 将Oracle.ManagedDataAccess GAC全局程序集中移除 1:用C ...
- 微信小程序前置课程:flex布局(二)
原文:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到 ...
- GTK+2.0学习——C指针回顾
工作需要,开始做GTK,但是很久没碰C了,来捡一下C的精华. 一.*和&的意义 *:指针运算符 &:取地址运算符 两者优先级一样,从右向左方向结合 二.指针和指针变量 指针:一个变量的 ...
- find指令参数
1.name ~ 根目录 . 当前和子目录 name之后跟的是文件名 find . -name "[a-z]*[4-9].log" -print 2.perm perm后面跟的是权 ...
- MAC OS U 盘制作与安装方法
伴随着 iMac 5K Retina 和新的 Mac mini 等硬件的发布,苹果终于都推出了 OS X Yosemite 系统正式版了!相信很多人都已经用上.不过对于一些不想升级,而是打算「全新安装 ...
- 解决Keras在IDE集成环境中找不到nvcc
在我们正确配置了Keras使用GPU,并在Terminal中运行一切顺利的的时候,转到Pycharm或者Eclipse中运行有可能会出现"nvcc not found on the $PAT ...
- pyhon的数据类型
1.数字 整型和浮点型 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647在64位系统上,整数的位数为64位,取值范围为-2** ...
- IIS添加服务
最近心血来潮,想学习一下WCF,看着网上的一个小例子就开始动手了. 写了一个简单的服务,准备发布时,才发现很多问题,根本不能像网上的那些大神一样“易得”. 其中遇到的一个的典型问题,就是提示为下载的文 ...