C++ 流控制函式setw()、setfill()、setbase()、setprecision()的使用
阿新 • • 發佈:2018-11-16
標頭檔案:
#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;
}