1 I/O流及流类库
流类库的结构
2 输出流
ostream对象流到文本文件中;
ofstream可以将对象与文件关联起来;
ostringstream可以将对象与字符串关联起来。
setprecision()、setiosflags()、setw均在< iomanip >中
3 setiosflags操纵符(manipulator),字面:给ios流设置标识
参数ios_base::left是ios_base的静态常量,因此引用时必须包括ios_base::前缀
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main() {
double values[] = { 1.23, 35.36, 653.7, 4358.24 };
string names[] = { "Zoot", "Jimmy", "Al", "Stan" };
for (int i = 0; i < 4; i++)
cout << setiosflags(ios_base::left)//左对齐
<< setw(6) << names[i]
<< resetiosflags(ios_base::left) //取消左对齐 reset
<< setw(10) << values[i] << endl;
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/15220ae272a44758be90374d804bbd5b.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/14f79315bb4bb1e86f778ddbe429f091.png)
4 精度,setprecision()操纵符
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main() {
double values[] = { 1.23, 35.36, 6424.346, 41231.343 };
string names[] = { "AA", "BB", "CC", "DD" };
cout << setiosflags(ios_base::scientific); //标志位科学计数法
for (int i = 0; i < 4; i++) {
cout << setiosflags(ios_base::left)
<< setw(6) << names[i]
<< resetiosflags(ios_base::left)
<< setw(10) << setprecision(1) << values[i] << endl; //精度为1,由于设置了scientific,即小数保留1位
//每次输出先设置宽度,再设置manipulator
}
return 0;
}
输出:
AA 1.2e+00
BB 3.5e+01
CC 6.4e+03
DD 4.1e+04
5 文件输出流:向二进制文件输出
文件输出流ofstream的对象可以把信息流到外部存储空间的文件中
①将内存中的一个结构体对象,按照其在内存中存储的二进制形式,直接写到磁盘中
一个类无法存储,故存储一个结构体.
四种强制类型转换,reinterpret_cast用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换
#include <fstream> //文件流
using namespace std;
struct Date {
int mon, day, year;
};
int main() {
Date dt = { 6, 12, 88 }; //顺序初始化struct
ofstream file("date.dat", ios_base::binary); //创建文件输出流对象file
//打开"data.dat"文件,指定二进制模式
file.write(reinterpret_cast<char*>(&dt), sizeof(dt)); //调用文件输出流对象file的write函数,把内存中的内容写到文件输出流中
//&dt为Date类型的地址,将其转换为指向字符的指针
file.close();//关闭文件
return 0;
}
6 字符串输出流:ostringstream
①将各类数据转换为字符串类型,注意是基本类型数据或重载了<<的数据类型
#include <sstream> //包含stringstream对象
#include <iostream>
#include <string>
using namespace std;
template <class T>
/*重载函数实例:将Point对象插入到字符串输出流的<<进行重载
ostringstream& operator << (ostringstream os, const &Point){
os << Point.x;
return os;
}
*/
string toString(const T& v) { //返回值是string
ostringstream os; //创建字符串输出流
os << v; //v插入到字符串输出流中
return os.str(); //注意要写os.str(),返回的是输出流生成的字符串
}
int main() {
cout << toString(22) << endl;
cout << toString(1.5) << endl;
return 0;
}