最重要的三个输出流

ostream

ofstream

ostringstream

预先定义的输出流对象

cout 标准输出

cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出

clog 类似于cerr,但是有缓冲,缓冲区满时被输出

构造输出流对象

ofstream类支持磁盘文件输出

如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的

ofstream myFile("filename");

可以在调用默认构造函数之后使用open成员函数打开文件

ofstream myFile;//声明一个静态文件输出流对象

myFile.open("filename");//打开文件,使流对象与文件建立联系

在构造对象或用open打开文件时可以指定模式

ofstream myFile("filename",ios_base::out|ios_base::binary);//打开一个用于输出的二进制文件

文件输出流成员函数的三种类型

与操纵符等价的成员函数

执行非格式化写操作的成员函数

其他修改流状态且不同于操纵符或插入运算符的成员函数

文件输出流成员函数

open函数

把流与一个特定的磁盘文件关联起来,需要指定打开模式

put函数

把一个字符写到输出流中

write函数

将内存中的一块内容写到一个文件输出流中

seekptellp函数

操作文件流的内部指针

close函数

关闭与一个文件输出流关联的磁盘文件

错误处理函数

在写到一个流时进行错误处理

插入<<运算符

为所有标准C++数据类型预先设计的,用于传送字节到一个输出流对象

使用width控制输出宽度

#include "stdafx.h"
#include <iostream>

using namespace std;


int main()
{
	double a[]={1.22,3.235,7.4322,9.3};
	for (int i = 0; i < 4; i++)
	{
		cout.width(10);
		cout<<a[i]<<endl;
	}
	system("Pause");
	return 0;
}

使用setw操纵符指定宽度

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
	double a[]={1.22,3.235,7.4322,9.3};
	string b[]={"Tom","Jude","Marry","Jerry"};
	for (int i = 0; i < 4; i++)
	{
		cout<<setw(8)<<a[i]<<setw(6)<<b[i]<<endl;
	}
	system("Pause");
	return 0;
}

设置对齐方式

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
	double a[]={1.22,3.235,7.4322,9.3};
	string b[]={"Tom","Jude","Marry","Jerry"};
	for (int i = 0; i < 4; i++)
	{
		cout<<setiosflags(ios_base::left)<<setw(8)<<a[i]<<resetiosflags(ios_base::left)<<setw(6)<<b[i]<<endl;//resetiosflags(ios_base::left)是将左对齐取消,恢复为默认的右对齐
	}
	system("Pause");
	return 0;
}

控制输出精度——未指定fixed或scientific

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
	double a[]={1.22,32.35,743.22,9.3};
	string b[]={"Tom","Jude","Marry","Jerry"};
	for (int i = 0; i < 4; i++)
	{
		cout<<setiosflags(ios_base::left)
			<<setw(8)<<setprecision(1)<<a[i]<<resetiosflags(ios_base::left)
			<<setw(6)<<b[i]<<endl;//resetiosflags(ios_base::left)是将左对齐取消,恢复为默认的右对齐
	}
	system("Pause");
	return 0;
}

当未指定fixed或scientific时,setprecision括号中的参数表示有效数字的位数

控制输出精度——指定fixed或scientific

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
	double a[]={1.22,32.35,743.22,9.3};
	string b[]={"Tom","Jude","Marry","Jerry"};
	cout<<setiosflags(ios_base::fixed);
	for (int i = 0; i < 4; i++)
	{
		cout<<setiosflags(ios_base::left)
			<<setw(8)<<setprecision(1)<<a[i]<<resetiosflags(ios_base::left)
			<<setw(6)<<b[i]<<endl;//resetiosflags(ios_base::left)是将左对齐取消,恢复为默认的右对齐
	}
	system("Pause");
	return 0;
}

指定fixed或scientific后,setprecision括号中的参数表示小数点后的位数

二进制文件流

使用ofstream构造函数中的模式参量指定二进制输出模式

以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式

通过二进制文件输出流对象完成输出

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;

struct Date
{
	int year;
	int month;
	int day;
};
int main()
{
	Date a={2019,3,2};
	ofstream file("date.dat",ios_base::binary);
	file.write(reinterpret_cast<char*>(&a),sizeof(a));
	file.close();
	system("Pause");
	return 0;
}

wirte后第一个参数为指向数据块首地址的字符型指针,第二个参数为数据块所占内存的大小

将对象在内存中存储的二进制形式直接写到磁盘文件中

向字符串中输出

字符串输出流(ostringstream)

用于构造字符串

支持ofstream类的除open、close外的所有操作

str函数可以返回当前已构造的字符串

典型应用:将数值转换为字符串

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

template<class T>
string toString(const T &v)
{
	ostringstream s;
	s<<v;
	return s.str(); 
}
int main()
{
	string a=toString(2);
	string b=toString(1.2);
	cout<<a<<" "<<b<<endl;
	system("Pause");
	return 0;
}