C++ 流控制函数setw()、setfill()、setbase()、setprecision()的使用

头文件:

#include <iostream>

#include <iomanip>

功能:

std::setw :需要填充多少个字符,默认填充的字符为' '空格

std::setfill:设置std::setw将填充什么样的字符,如:std::setfill('*')

std::setbase(n):将输出数据转换为n进制

std::setprecision():控制输出流显示浮点数的数字个数,C++默认的流输出数值有效位是6。

示例代码:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <shlobj.h>


//AppData
std::wstring GetUserAppDataDir()
{
	std::wstring appdata;
	wchar_t buffer[MAX_PATH];
	::ZeroMemory(buffer, MAX_PATH*sizeof(wchar_t));
	if (::SHGetSpecialFolderPath(NULL, buffer, CSIDL_APPDATA, NULL))
		appdata = buffer;

	if (appdata.substr(appdata.length() - 1) != L"\\")
	{
		appdata.append(L"\\");
	}
	return appdata;
}

//生成日志文件路径
std::wstring GetLogFileName()
{
	SYSTEMTIME sysTime;
	::GetLocalTime( &sysTime );

	std::wstringstream logFileName;
	logFileName << GetUserAppDataDir().c_str() << L"_"
		<< sysTime.wYear << L"_"
		<< std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMonth << L"_"
		<< std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wDay << L"_"
		<< std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wHour << L"_"
		<< std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMinute << L"_"
		<< std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wSecond << L".log";

	return logFileName.str();
}

//字符串转数字
template <class T> T to_num( const char* s )
{
	T tmp(0);
	std::istringstream is(s);
	is >> std::setbase(10) >> tmp;//setbase(n):将输出数据转换为n进制
	if(is.fail())
	{
		return 0;
	}
	return tmp;
};

//测试代码
int main()
{
	int a = 1;
	int b = 2;
	char c = '$';
	//输出:   1
	std::cout << std::setw( 4 ) << a << std::endl;
	//输出:$$$1
	std::cout << std::setw( 4 ) << std::setfill( c ) << a << std::endl;
	//输出:$$$12
	std::cout << std::setw( 4 ) << std::setfill( c ) << a << b << std::endl;
	//输出日志文件路径
	std::wcout << GetLogFileName().c_str() << std::endl;
	std::cout << "\n" << std::endl;

	//std::setbase()的使用
	int num = to_num<int>("1234");
	long ldata = to_num<long>("123456");
	std::cout << num << std::endl;
	std::cout << ldata << std::endl;
	std::cout << "\n" << std::endl;

	std::cout << "255(2进制): " << std::setbase(2) << 255 << std::endl;//二进制输出
	std::cout << "255(8进制): " << std::setbase(8) << 255 << std::endl;//八进制输出
	std::cout << "255(16进制): " << std::setbase(16) << 255 << std::endl;//十六进制输出

	//setprecision()的作用: 控制输出流显示浮点数的数字个数(C++默认的流输出数值有效位是6)
	//如果与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。
	//setiosflags(ios::fixed)是用定点方式表示实数。
	//setiosflags(ios::scientific)是用指数方式表示实数。
	std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(8) << 12.123456 << std::endl;

	//如果与setiosflags(ios::scientific)合用,可以控制指数表示法的小数位数。
	//在用浮点表示的输出中,setprecision(n)表示有效位数。
	//在用定点表示的输出中,setprecision(n)表示小数位数。

	system("pause");
	return 0;
}

输出结果:

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值