C++ Primer Plus 书之--C++ cout输出及cout的格式化setf()

本文详细介绍了C++中的IO流,包括cout的使用、刷新缓存区、字段宽度调整、填充字符设置和浮点数精度控制。通过setf()函数可以实现更多复杂的格式化操作,如显示小数点、基数前缀等。iostream库和iomanip头文件提供了丰富的输出控制功能。
摘要由CSDN通过智能技术生成

和IO相关的类:

1. streambuf类为缓冲区提供了内存, 并提供了用于填充缓冲区, 访问缓冲区内容, 刷新缓冲区和管理缓冲区内存的类方法;

2. ios_base类表示流的一般特征, 如是否可读取, 是二进制流还是文本流等.

3. ios类基于ios_base, 其中包括了一个指向streambuf对象的指针成员;

4. ostream类时从ios类派生而来的, 提供了输出方法;

5. istream类也是从ios类派生而来的, 提供了输入方法;

6. iostream类时基于istream和ostream类的, 因此继承了输入和输出方法.

要使用这些工具, 必须使用适当的类对象. 例如: 使用ostream对象(如cout)来处理输出.

C++的iostream类库管理了很多细节. 例如, 在程序中包含iostream文件将自动创建8个流对象(4个用于窄字符流, 4个用于宽字符流).

cin 对象对应于标准输入流, 在默认情况下, 这个流被关联到标准输入设备(通常为键盘). wcin 对象与此类似, 但处理的是wchar_t类型.

cout 对象与标准输出流相对应. wcout对象与此类似, 但处理的是wchar_t类型

cerr 对象与标准错误流相对应, 可用于显示错误信息. 这个流没有被缓冲, 也就是信息将直接被发送给屏幕, 而不会等到缓冲区满了或者新的换行符. wcerr对象用于处理wchar_t类型.

clog 对象也对应这标准错误流, 这个流被缓冲. wclog用于处理wchar_t类型

对象代表流: 当iostream文件尾程序声明了一个cout对象时, 该对象将包含存储了与输出有关信息的数据成员, 如显示数据时使用的字段宽度, 小数位数, 显示整数时采用的计数方法以及描述用来处理输出流的缓冲区的streambuf对象的地址. 下面的语句通过指向的streambuf对象将字符串"Bjarna free"中的字符放到cout管理的缓冲区中.

cout << "Bjarne free";

 

cout的使用

cout重载了operator<<()函数, 并返回一个指向ostream对象的引用, 因此可以将输出链接起来:

cout << "hello " << "word." << endl;

输出和指针

ostream类还为下面的指针类型定义了插入运算符函数:

const signed char*;
const unsigned char*;
const char*;
void *;

C++用指向字符串存储位置的指针来表示字符串, 指针的形式可以使char数组名, 显示的char指针, 或用引号括起来的字符串. 看下面这个例子:

char sen[20] = "first sentence";
char * psen = "second sentence";
cout << "Hello";
cout << sen;
cout << psen;

方法使用字符串中的终止空字符来确定何时停止显示字符.

对于其他类型的指针, C++将其对应于void *, 并打印地址的数值表示. 如果要获取字符串的地址, 则必须将其强制转换为其他类型, 举个例子:

int eggs = 12;
char * amount = "dozen";
// 打印eggs变量的地址
cout << &eggs;
// 打印dozen
cout << amount;
// 打印"dozen"字符串的地址
cout << (void *)amount;

其他ostream方法:

除了各种operator<<()函数外, ostream类还提供了put()方法和write()方法, 前者用于显示字符, 后者用于显示字符串. 与<<运算符一样, 该函数也返回一个指向调用对象的引用, 因此也可以用于拼接输出:

cout.put('I').put('I');

我们还可以将数值型参数(如int)用于put(), 让函数原型自动将参数转换为正确的char值, 例如:

// A
cout.put(65);
// B
cout.put(66.3);

write()方法显示整个字符串, 其模板原型如下:

basic_ostream<chartT, traits> & write(const char_type * s, streamsize n);

write的第一个参数提供了要显示的字符串的地址, 第二个参数指出要显示多少个字符.

来看一个完整的例子:

// wirte.cpp
#include <iostream>
#include <cstring>

int main()
{
	using std::cout;
	using std::endl;
	const char * state1 = "Florida";
	const char * state2 = "Kansas";
	const char * state3 = "Euphoria";
	int len = std::strlen(state2);
	cout << "Increasing loop index:\n";
	int i;
	for(i = 1; i <= len; i++)
	{
		cout.write(state2, i);
		cout << endl;
	}
	
	cout << "Decreasing loop index:\n";
	for(i = len; i > 0; i--)
		cout.write(state2, i) << endl;
	
	cout << "Exceeding string length:\n";
	// 超出state2的边界了 ,  但是write不会停止打印, 会继续打印直到达到指定的字符数
	cout.wri
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值