C++的I/O流

本文详细介绍了 C++ 中的输入输出流格式化方法,包括数字输出的布尔值、整型和浮点型的进制与小数点格式化,以及对自定义类实现的输入输出操作符重载技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 流之间的继承关系


在C++语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间(当然可用该空间存储任何信息)进行输入输出这三个方面。

 

对标准输入设备和标准输出设备的输入输出简称为标准I/O;

对在外存磁盘上文件的输入输出简称为文件I/O;

对内存中指定的字符串存储空间的输入输出简称为串I/O;

 

看各个流之间的继承关系, 如下图

 

http://www.cplusplus.com/reference/iolibrary/


二. 输出输入流的格式化

#include "stdafx.h"

#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>

int _tmain(int argc, _TCHAR* argv[])
{

	// 1. 原来的状态
	std::ostream::fmtflags oldFlags = std::cout.flags();	// 保存原来的状态值
	std::cout.flags(oldFlags);								// 恢复原先保存的状态值

	// 2. bool型输出为字符/数字
	std::cout <<"数字 : " << true << " / " << false << std::endl;						// 以0/1的形式输出(保持原来方式)
	std::cout <<"数字 : " << std::noboolalpha << true << " / " << false << std::endl;	// 以0/1的形式输出(显式设置)
	std::cout <<"字符 : " << std::boolalpha << true << " / " << false << std::endl;		// 以true/false的形式输出

	// 3. 对整形值以不同进制输出; 对浮点型无效.
	int i = 255;
	std::cout << "八进制 : " << std::oct << i << std::endl;		// 输出: 八进制 : 377
	std::cout << "十进制 : " << std::dec << i << std::endl;		// 输出: 十进制 : 255
	std::cout << "十六进制 : " << std::hex << i << std::endl;		// 输出: 十六进制 : ff	
	// 3.1 设置进制的前面的字母, 例如十六进制是 0x;
	std::cout << std::showbase;
	std::cout << "八进制 : " << std::oct << i << std::endl;		// 输出: 八进制 : 0377
	std::cout << "十进制 : " << std::dec << i << std::endl;		// 输出: 十进制 : 255
	std::cout << "十六进制 : " << std::hex << i << std::endl;		// 输出: 十六进制 : 0xff
	std::cout << std::noshowbase;
	// 3.2 进制中的字母是大写
	std::cout << std::showbase << std::uppercase ;
	std::cout << "十六进制 : " << std::hex << i << std::endl;		// 输出: 十六进制 : 0XFF
	std::cout << std::nouppercase ;
	std::cout << "十六进制 : " << std::hex << i << std::endl;		// 输出: 十六进制 : 0xff
	std::cout << std::dec;		// 恢复为十进制显示

	// 4. 浮点型的格式化输出
	// 4.1 显示前N个数字
	// 显示前4个数字, 默认值为6
	std::cout << std::cout.precision(4) << 12.345678 << std::endl;	// 输出: 12.35 四色五入输出
	// 显示前10个数字
	std::cout << std::cout.precision(10) << 12.345 << std::endl;	// 输出: 12.345 后面不会补0
	std::cout.precision();					// 查询当前值
	// 4.2 小数点后面N位与科学计数法
	double d = 10 / 3.0;
	std::cout.precision(6);							// 配合std::fixed和std::scientific时, 就是小数点后6位.
	std::cout << std::fixed << d << std::endl;		// 3.333333 小数点后共6位
	std::cout << std::scientific << d << std::endl;	// 3.333333e+000 : 小数点后共6位
	// 4.3 恢复回浮点型的格式初始设置
	std::cout.unsetf(std::ostream::floatfield);

	// 5. 小数点后面位数不足, 补零
	std::cout.precision(6);							// 配合std::fixed和std::scientific时, 就是小数点后6位.
	std::cout << std::fixed << std::showpoint << 10.0 << std::endl;    // 输出 : 10.000000 保留小数点后面6位数字, 不足的话补0
	std::cout << std::noshowpoint << std::endl;		// Revert to default handling of decimal  

	// 6. 设置左边填充(右对齐输出很有用)
	// 6.1 左边填充, 默认是空格, 大于设定的位的话, 就正常输出了
	std::cout.unsetf(std::ostream::floatfield);			// 恢复一下
	std::cout << std::setw(10) << 12.3 << std::endl;	// 输出: ______12.3 左边补空格
	std::cout << std::setw(10) << 12 << 3 << std::endl;	// 输出: ________123 std::setw只对当次有效.
	std::cout << std::setw(3) << 12.345 << std::endl;	// 输出的内容大于设定的位的话, 就正常输出了

	// 7. 对齐输出
	// 7.1 左对齐/右对齐
	std::cout << std::left;		// 左对齐
	std::cout << std::setw(5) << 12 << std::setw(5) << 34 << std::endl;		// 12___34___
	std::cout << std::right;	// 右对齐(默认)
	std::cout << std::setw(5) << 12 << std::setw(5) << 34 << std::endl;		// ___12___34
	std::cout << std::internal;	// 负号就左对齐, 数值就右对齐
	std::cout << std::setw(5) << -12 << std::endl;							// -__12
	// 7.2 对齐的填充
	std::cout << std::setfill('*');	// 设置填充星号
	std::cout << std::left;			// 左对齐
	std::cout << std::setw(5) << 12 << std::endl;		// 12***
	std::cout << std::right;		// 右对齐
	std::cout << std::setw(5) << 12 << std::endl;		// ***12
	std::cout << std::internal;	// 负号就左对齐, 数值就右对齐
	std::cout << std::setw(5) << -12 << std::endl;		// -**12

	return 0;
}


三. 类的"<<"和">>"操作符的重载


对"<<"和">>"重载的函数形式如下:
istream & operator >> (istream &, 自定义类 &);
ostream & operator << (ostream &, 自定义类 &);

1. ">>" 操作符的函数的第一个参数和函数的类型都必须是istream&类型, 第二个参数是要进行输入操作的类.
2. "<<" 操作符的函数的第一个参数和函数的类型都必须是ostream&类型, 第二个参数是要进行输出操作的类.
3. 只能将重载">>"和"<<"的函数作为友元函数或普通的函数, 不能将它们定义为成员函数.


class COutput
{
public:
	COutput()
	{
		m_dA = 0.0;
		m_dB = 0.9;
	}

	COutput(double dA, double dB)
		: m_dA(dA)
		, m_dB(dB)
	{}

	friend std::ostream& operator << (std::ostream& oss, COutput& outPut)
	{
		return oss << outPut.m_dA << "\r\n" << outPut.m_dB;
	}

	friend std::istream& operator >> (std::istream& iss, COutput& outPut)
	{
		std::cout << "m_dA:\r\n";
		iss >> outPut.m_dA;
		std::cout << "m_dB:\r\n";
		iss >> outPut.m_dB;
		return iss;
	}

private:
	double m_dA;
	double m_dB;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值