《C++标准库》学习笔记 — STL —流

本文详细介绍了C++ STL中的流操控,包括自定义操控器、I/O操作符、格式化标志和流的连接。通过实例展示了如何控制输入输出的宽度、自定义输出操作符以及实现流的重定向。此外,还讨论了如何使用iword和pword设置和获取格式化标志,以及tie和rdbuf方法在流耦合中的应用。
摘要由CSDN通过智能技术生成

一、操控器

所谓操控器是一种专门用来操控 stream 的一种对象,通常它只会改变输入的解释方式输出的格式化方式。带实参的操控器被定义在 文件中,如 setw 等;不带实参的操控器包括 endlflush

1、原理

操控器的实现原理其实是函数指针。在 ostream 中定义了 operator<< 的多种重载,其中包括:

__ostream_type& operator<<(__ostream_type& (*__pf)(__ostream_type&))
{
   
	return __pf(*this);
}

我们通过传入不同的操控器函数指针,即可触发不同的处理。以 endl 为例:

template<typename _CharT, typename _Traits>
inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os)
{
    return flush(__os.put(__os.widen('\n'))); }

widen 函数用于国际化相关操作。

2、自定义操控器

参考标准库中操控器的定义,我们可以自定义操控器用于读取忽略一行中的剩余输入:

#include <iostream>
#include <limits>
using namespace std;

template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>& ignoreLine(basic_istream<_CharT, _Traits>& is)
{
    
	is.ignore(numeric_limits<streamsize>::max(), is.widen('\n'));
	return is;
}

int main(int argc, char* argv[])
{
   
	char ch;
	int numOfLinesStartWithA = 0;
	
	while((ch = cin.get()) != 'q')
	{
   
		if (ch == 'A')
		{
   
			numOfLinesStartWithA++;
		}
		
		cin >> ignoreLine;
	}
	
	cout << numOfLinesStartWithA << " lines start with A" << endl;

    return 0;
}

在这里插入图片描述

3、控制输入的宽度

我们可以用 setw 控制输出数据的宽度。此操作符同样可以用于输入上,主要作用在与C风格字符串共同使用:

char buffer[80];
cin >> setw(sizeof(buffer))>> buffer;

这样可以防止输入溢出。

二、自定义 I/O 操作符

假设我们有这样一个处理分数的类:

class Fraction
{
   
public:
	Fraction(int numerator, int denominator):
		numerator(numerator),
		denominator(denominator)
	{
   }

	int getDenominator() const
	{
   
		return denominator;
	}
	
	int getNumerator() const
	{
   
		return numerator;
	}
	
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值