eg : cout.setf( ios::dec );
cout.setf(ios::hex,ios::basefield);【建议使用这种】
需注意:
1、fmtflags setf( fmtflags flags ); 使用这种,一定要先取消当前基【cout.unself()】,之后才可以设置新的基
2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用这种,第二个参数设为当前的基,或者当不知道当前基时,设为ios_base::basefield清除当前的所有可能的基
文件输入输出流fstream
ofstream, ifstream, fstream
在头文件fstream中,在fstream类中,用open成员函数打开文件,实现类与文件的关联操作。
- open(filename, mode, prot):对所属类进行用指定的参数进行特定的文件关联
几种打开方式(mode):(这些方式可以用 '|' 组合起来)
1. 文件打开方式
ios::in
tellp(): 返回输出流指针的位置(返回类型long)
- 设置指针位置
seekg(long position): 设置输入流指针位置为第position个字符(文件首位置为开始位置)
seekp(long position): 设置输出流指针到指定位置
istream &seekg(streamoff offset,seek_dir origin);
ostream &seekp(streamoff offset,seek_dir origin);
ios::beg: 文件开头
ios::cur: 文件当前位置
ios::end: 文件结尾
字符串输入输出流sstringstream
ostringstream:用于执行C风格字符串的输出操作
istringstream:用于执行C风格字符串的输入操作
stringstream:同时支持C风格字符串的输入输出操作
#include "stdio.h"
#include <iostream>
#include <sstream>
using namespace std;
void ostringstream_test()
ostringstream oss;
oss << "this is test" << '\t'<< 123456;
cout << oss.str() << endl;
oss.str(""); // 清空之前的内容
// oss.clear(); // 并不能清空内存
cout << oss.str() << endl;
// 浮点数转换限制
double dbVal = 123.123455677;
oss << dbVal;
cout << oss.str() << endl;
oss.str("");
oss.precision(9);
oss.setf(ios::fixed, ios::basefield); // 将浮点数的位数限定为小数点之后的位数
oss << dbVal;
cout << oss.str() << endl;
void istringstream_test()
// 输入
stringstream ss;
ss << "this is test" << ' '<< 123456;
cout << ss.str() << endl;
// 输出
string out;
while (ss >> out)
cout << out.c_str() << endl;
例:日志信息输出
(1)功能思维导图
(2)代码实现

Logging.h
#pragma once
#include <stdio.h>
#include <Windows.h>
#define MAX_BUFFSIZE 8192
namespace Logger
enum LOGMODE
CONSOLE = 0x1,
LOGFILE = 0x2,
CONSOLE_FILE=0x3
enum LOGLEVEL
INFO = 0,
DEBUG
class CLogging
public:
explicit CLogging();
explicit CLogging(const int LogMode, char *pFileName=NULL, char *pFileMode=NULL);
~CLogging(void);
void LogPrintf(char* pFormat, ...);
private:
inline void OutputLoginfo(const char *pBuff);
private:
TCHAR *m_pLogFileName;
TCHAR *m_pLogFileMode;
int m_LogMode;
FILE *m_pFile;
HANDLE m_hMuex;

Logging.cpp
#include "Logging.h"
#include <time.h>
namespace Logger
CLogging::CLogging(void)
m_pLogFileName = NULL;
m_pLogFileMode = NULL;
m_pFile = NULL;
m_hMuex = NULL;
CLogging::CLogging( const int LogMode, char *pFileName, char *pFileMode ):
m_LogMode(LogMode),m_pLogFileName(pFileName),m_pLogFileMode(pFileMode)
m_hMuex = CreateMutex(NULL, 0, NULL);
m_pFile = NULL;
switch (LogMode)
case CONSOLE:
break;
case LOGFILE:
case CONSOLE_FILE:
m_pFile = fopen(m_pLogFileName, pFileMode);
if (!m_pFile)
throw ("Open LogFile Error!");
break;
CLogging::~CLogging(void)
if (m_pFile)
fclose(m_pFile);
if (m_hMuex!=NULL)
CloseHandle(m_hMuex);
void CLogging::LogPrintf(char* pFormat, ... )
DWORD nRet = WaitForSingleObject(m_hMuex, 5000);
switch (nRet)
case WAIT_OBJECT_0:
va_list args;
char cText[MAX_BUFFSIZE] = {0};
va_start(args, pFormat);
vsprintf(cText, pFormat, args);
OutputLoginfo(cText);
va_end(args);
ReleaseMutex(m_hMuex);
break;
case WAIT_TIMEOUT:
break;
case WAIT_FAILED:
break;
inline void CLogging::OutputLoginfo( const char *pBuff )
time_t CurrentTime;
time(&CurrentTime);
char TimeBuff[MAX_PATH] = {0};
char cBuff[MAX_BUFFSIZE] = {0};
// 根据日志级别的不同配置不同的显示信息
strftime(TimeBuff, sizeof(TimeBuff), "%H:%M:%S",localtime(&CurrentTime) );
//sprintf_s(cBuff, MAX_BUFFSIZE, "[%s] [%s: %s] %d entered\n %s", TimeBuff, __FILE__, __FUNCTION__, __LINE__, pBuff);
sprintf_s(cBuff, MAX_BUFFSIZE, "[%s] [%s:] %d entered\n %s", TimeBuff, __FUNCTION__, __LINE__, pBuff);
switch (m_LogMode)
case CONSOLE:
printf(cBuff);
break;
case LOGFILE:
fputs(cBuff, m_pFile);
break;
case CONSOLE_FILE:
printf(cBuff);
fputs(cBuff, m_pFile);
break;

StopWatch.h
#pragma once
namespace Logger
class CStopwatch
private:
// 64位有符号整数可以用INT64 _int64 LARGE_INTEGER表示
LARGE_INTEGER m_nPerfFrequency;
LARGE_INTEGER m_nPerFrefStart;
public:
CStopwatch(){QueryPerformanceFrequency(&m_nPerfFrequency); Start();}
inline void Start(){QueryPerformanceCounter(&m_nPerFrefStart);}
inline INT64 Now() const
LARGE_INTEGER nPerfNow;
QueryPerformanceCounter(&nPerfNow);
return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000) / m_nPerfFrequency.QuadPart;
inline INT64 NowInMicro() const
LARGE_INTEGER nPerfNow;
QueryPerformanceCounter(&nPerfNow);
return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000000) / m_nPerfFrequency.QuadPart;

test.cpp
#include "stdio.h"
#include "Logging.h"
#include "StopWatch.h"
using namespace Logger;
#include <iostream>
using namespace std;
bool bThead1 = false;
bool bThead2 = false;
void TestFun1()
CLogging log(CONSOLE|LOGFILE, "D:\\testlog.txt", "a+");
for (int i = 0 ; i < 100; i ++)
log.LogPrintf("%s 0x%0x\n", "hello", i);
void TestFun2()
CLogging log(CONSOLE|LOGFILE, "D:\\testlog.txt", "a+");
for (int i = 101 ; i < 200; i ++)
log.LogPrintf("%s %0x\n", "hello", i);
DWORD WINAPI ThreadFun1(LPVOID lparam)
TestFun1();
cout << "thread1 end" << endl;
bThead1 = true;
return 0;
DWORD WINAPI ThreadFun2(LPVOID lparam)
TestFun2();
cout << "thread2 end" << endl;
bThead2 = true;
return 0;
int main()
CStopwatch watch;
//TestFun(); 单线程测试
// 多线程测试
DWORD lpThreadId1 = 0;
DWORD lpThreadId2 = 1;
HANDLE hThread1 = CreateThread(NULL, 0, ThreadFun1, NULL, 0, &lpThreadId1);
//HANDLE hThread2 = CreateThread(NULL, 0, ThreadFun2, NULL, 0, &lpThreadId2);
while(1)
if (bThead1 && bThead2)
break;
cout <<"共用时:"<< watch.Now()<<"ms" << endl;
return 0;