cout之详解

1.  cout 究竟是什么? 

      cout是C++中的“标准输入输出流”对象。C++中推荐使用cout,C中推荐使用printf。

    其实,cout是一个iostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕啦)输出东东。简单的说,就是 运算符重载,重载了“<<”运算符。请看HelloWorld!的等效版本: 

 


    
#include   < iostream >

using namespace std;   

int main()   

{

  cout.
operator << ( " Hello,World! " );

  cout.
operator << (endl);

  
return 0 ;

}  

编译运行,结果一致。

 

2.  为什么函数operator<<能够接受不同类型的数据,如整型、浮点型、字符串甚至指针呢?

   运算符函数与一般函数基本无异,可以任意重载。标准库的设计者们早已经为我们定制了iostream::operator<<对于各种C++基本数据类型的重载版本。

 

3.  仿真验证cout

     我们自己来实现一个cout的简化版(Lite)。为了区分,我们把我们设计的cout对象命名的myout,myout对象所属的类为MyOutstream。我们要做的就是为MyOutstream类重载一系列不同类型的operator<<运算符函数,简单起见,这里我们仅实现了对整型(int)与字符串型(char*)的重载。为了表示与iostream断绝关系,我们不再用头文件iostream,而使用古老的stdio中的printf函数进行输出,程序很简单,包括完整的main函数,均列如下:  

 

 

     
class MyOutstream   

{

 
public :  

 
const MyOutstream & operator << ( int value) const ; // 对整型变量的重载  

 
const MyOutstream & operator << ( char * str) const ; // 对字符串型的重载  

 };   

const MyOutstream & MyOutstream:: operator << ( int value) const   

{

  printf(
" %d " ,value);   

  
return * this ; // 注意这个返回……   

}  

 
const MyOutstream & MyOutstream:: operator << ( char * str) const  

{  

  printf(
" %s " ,str);   

  
return * this ; // 同样,这里也留意一下……  

}   

MyOutstream myout;
// 随时随地为我们服务的全局对象myout   

int main()  

{

  
int a = 2003 ;   

  
char * myStr = " Hello,World! " ;  

  myout
<< myStr << " \n " ;

  
return 0 ;   

}   



  

4.  如何实现cout<<...  <<...  连续输出字符的功能

      考虑到cout能够连续输出字符,例如cout<<"Hello,World!"<<endl; 而不是cout<<"Hello,World!"; cout<<endl, 我们分析一下:按执行顺序,系统首先调用cout.operator<<("Hello,World!"),然后cout.operator<<会返回它本身,就是说在函数的最后一行会出现类似于return *this这样的语句,因此cout.operator<<("Hello,World!")的调用结果就返回了cout,接着它后面又紧跟着.operator<<(endl),这相当于cout.operator<<(endl)——于是又会进行下一个输出,如果往下还有很多<<算符,调用就会一直进行下去。

 

 5.  C++中的endl的功能与含义 

      运行函数,得到结果:myout<<"\n" ,最后出现的"\n"可以实现一个换行,不过我们在用C++时教程中推荐使用endl。     

      endl是一个操纵符(manipulator),它不但实现了换行操作,而且还对输出缓冲区进行刷新。原来在执行输出操作之后,数据并非立刻传到输出设备,而是先进入一个缓冲区,当适宜的时机(如设备空闲)后再由缓冲区传入,也可以通过操纵符flush,ends,或unitbuf进行强制刷新:cout<<"Hello,World!"<<"Flush the screen now!!!"<<flush;  这样当程序执行到operator<<(flush)之前,有可能前面的字符串数据还在缓冲区中而不是显示在屏幕上,但执行operator<<(flush)之后,程序会强制把缓冲区的数据全部搬运到输出设备并将其清空。而操纵符endl相当于<<"\n"<<flush; 不过可能在屏幕上显示是手动刷新与否区别看来都不大。但对于文件等输出对象就不大一样了:过于频繁的刷新意味着老是写盘,会影响速度。因此通常是写入一定的字节数后再刷新,如何操作?靠的就是这些操纵符。

 

本文转自 http://baike.baidu.com/view/1261354.htm 

由本人进行了简化

 

转载于:https://www.cnblogs.com/meimei888/archive/2010/10/20/1856832.html

### C++ 中 `cout` 的使用方法及详解 #### 一、基本概念 在C++中,`cout` 是一个输出流对象,用于向标准输出设备(通常是控制台)输出数据[^1]。它属于C++标准库中的类 `ostream` 的一个实例。 为了能够正常使用 `cout` 对象以及相关的流操作符,在编写程序时需确保包含了 `<iostream>` 头文件并指定了命名空间 `std`[^4]: ```cpp #include <iostream> using namespace std; ``` #### 二、常用功能介绍 ##### (一)基础输出 可以利用插入运算符 `<<` 将不同类型的数据发送给 `cout` 进行显示。例如整数、浮点数、字符和字符串等都可以被直接打印出来: ```cpp int main(){ int num = 100; double pi = 3.1415926; char ch = 'A'; string str = "Hello world!"; cout << "Integer: " << num << endl; // 整型变量输出 cout << "Double : " << pi << endl; // 浮点型变量输出 cout << "Char : " << ch << endl; // 字符输出 cout << "String : " << str << endl; // 字符串输出 return 0; } ``` ##### (二)特殊成员函数应用 ###### 1. 刷新缓冲区 当调用了某些特定的方法之后,比如 `put()` 或者 `write()` ,实际的数据并不会立刻出现在屏幕上而是先进入到了内部维护着的一块叫做“缓冲区”的地方等待刷新;此时可以通过显式地调用 `flush()` 方法来强制清空这个缓存并将其中的内容立即呈现给用户[^2]: ```cpp // 显示消息前不加换行符 cout << "Processing..." << flush; for(int i=0;i<5;++i){ Sleep(1000); // 延迟一秒 } // 继续后续的信息输出... cout << "\nDone!" << endl; ``` ###### 2. 获取/设置写指针位置 对于更复杂的场景下可能还需要获取当前正在写的偏移量(`tellp`)或者是调整该位置(`seekp`)以便实现更加灵活多样的I/O需求[^3]: - **tellp**: 返回当前位置相对于起始处的距离; - **seekp**: 移动光标至指定的位置继续读取或覆盖原有内容。 下面的例子展示了如何结合这两个特性完成对已存在文本部分区域的修改工作: ```cpp ofstream file("example.txt"); if(!file.is_open()){ cerr << "Failed to open the file." << endl; exit(-1); } string originalText="This is an example."; file.write(originalText.c_str(),originalText.size()); // 关闭再重新打开以允许随机访问模式下的编辑行为 file.close(); file.open ("example.txt", ios::in | ios::out); // 定位到第四个字节准备替换掉接下来三个字母成为"new" file.seekp (8, ios::beg); file.write ("new", sizeof("new")-1); // 验证更改后的结果 char buffer[20]; memset(buffer,'\0',sizeof(buffer)); file.seekg(ios::beg); file.read(buffer,sizeof(buffer)-1); cout<<"Modified content:"<<buffer<<endl; file.close(); ``` 注意上述代码片段仅作为教学用途展示了一些高级特性的运用方式,并不适合所有场合,请根据实际情况合理选用相应API接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值