1. I/O标准流类库

2. 输出流

(1)不需要手动构造的输出流对象

  • cout:标准输出流
  • cerr:标准错误输出流,没有缓冲,直接输出,常用于输出错误提示语句
  • clog:类似cerr,但有缓冲,缓冲区溢出时溢出

(2)构造输出流对象

a. 调用输出流对象时指定对象名

ofstream myFile("filename");

b. 使用默认构造函数,然后调用open成员函数

ofstream myFile;
myFile.open();

(打开多个文件时,只有一个是打开的)

ofstream file;
file.open("FILE1");
//...
file.close();
file.open("FILE2");
//...
file.close();

(open函数可以直接传入字符串)

ofstream file;
std::string filename;
file.open(filename);

(3)控制输出格式

a. 输出宽度

width(): 设置输出宽度,在输出内容前默认加入空格占位(即右对齐)---fill():自定义填充字符

double values[]={1,10,100};
cout.fill("*");
for(int i=0;i<3;i++)
{
    cout.width();// 调用时是用成员调用
    cout<<values[i]<<endl;
}

setw():为同一行的不同项设置指定宽度,也可以使用set()运算符 #include<iomanip>

cout<<setw(6)<<arr[0]<<setw(4)<<arr[1]<<endl;

width()和setw()只影响下一个输出的对象(下一个域),但其他流格式选项保持有效直到发生改变,例如fill width()和setw()不截断数值,溢出的部分也会显示

b. 对齐方式

输出流默认为右对齐文本,可用setiosflags #include<iomanip>

for(int i=0;i<4;i++)
{
    cout<<setiosflags(ios_base::left)<<setw(6)<<arr[i]<<endl;
}

ios_base::left是ios_base的静态常量setiosflags的影响持久,可用resetiosflags还原取消设置左对齐

cout<<resetiosflags(ios_base::left)<<setw(6)<<arr[i]<<endl;//

(此外若要避免之前设置的格式影响,还可使用put语句)

cout.put('A');

c. 精度

setprecision() #include<iomanip>

cout<<setiosflags(ios_base::fixed);//固定格式,不使用科学计数法
cout<<setiosflags(ios_base::scientific);//科学计数法形式

d. 进制

setiosflags(ios_base::oct);//八进制
setiosflags(ios_base::hex);//十六进制
setiosflags(ios_base::dec);//默认的十进制

3. 文件读写操作

(1)流程

包含头文件#include<fstream> --> 创建流对象 ofstream/ifstream -->打开文件 对象.open("文件路径",打开方式)-->读/写数据 对象<<"写/读入的数据" --> 关闭文件 对象.close()

(2)打开文件的方式

(3)在读文件过程中四种方式接收读取数据

char buf[1024]={0};
while(ifs>>buf)
{
    cout<<buf;
}
char buf[1024]={0};
while(ifs.getline(buf))
{
    cout<<buf;
}
string buf;
while(ifs>>buf)
{
    cout<<buf;
}
char c;
while((c=ifs.gets())!=EOF)
{
    cout<<c;
}

4. 字符串输出流

#include<sstream>输出流除了可以向屏幕和文件输出信息外,还可以生成字符串ostringstream类与ofstream类同为ostream的派生类,与ofstream相比只缺少open和close函数ostringstream类还有一个特殊的函数成员str,返回一个string对象,表示生成字符串的内容osstringstream类有两个构造函数

ostringstream os(流的打开模式);//当为默认的ios_base::out时可省略为缺省
ostringstream os(对象,流的打开模式);

<典例>将数值转为字符串

#include<iostream>
#include<sstream>
#include<string>
using namespace std;

template<class T>
inline string toString(const T&v)
{
     ostringstream os;
     os<<v;
     return os.str();
}
//  该模版可以将任意支持"<<"插入符的类型转换为字符串