C++中的所有输入输出流:
最重要的三个输出流:
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函数
-- 将内存中的一块内容写到一个文件输出流中
-- seekp和tellp函数
-- 操作文件流的内部指针
-- close函数
-- 关闭与一个文件输出流关联的磁盘文件
-- 错误处理函数
-- 在写到一个流时进行错误处理
操纵符(manipulator)
-- 插入运算符与操纵符一起工作: 控制输出格式
-- 很多操纵符都定义在: ios_base类中(例如hex()), <iomanip>头文件(如setprecision())
-- 控制输出宽度: 在流中放入setw操纵符或者调用width成员函数为每个项指定输出宽度
-- setw和width仅影响紧随其后的输出项,但其他流格式操纵符保持有效直到发生改变
-- dec, oct和hex操纵符设置输入和输出的默认进制
例子1:
#include <iostream>
using namespace std;
int main(){
double values[] = {1.23, 35.36, 653.7, 4358.24};
for(int i = 0; i<4; i++){
cout.width(10);
cout << values[i] << endl;
}
return 0;
}
运行结果:
在这段代码里,cout.width(10); 代表占的字符数为10,因为没有设置对齐方式,所以采用默认的右对齐
例子2:
#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", "AI", "Stan"};
for(int i = 0; i<4; i++){
cout<<setiosflags(ios_base::left) //左对齐
<<setw(6)<<names[i]
<<resetiosflags(ios_base::left) //取消左对齐
<< setw(10) << values[i] << endl;
}
return 0;
}
运行结果:
字符串输入流(istringstream):
-- 用于从字符串读取数据
-- 在构造函数中设置要读取的字符串
-- 功能: 支持ifstream类的除open,close外的所有操作
-- 典型应用:将字符串转换为数值
两个重要的输入/输出流:
-- 一个iostream对象可以是数据的源或目的
-- 两个重要的I/O流类都是从iostream派生的,它们是fstream和stringstream。这些类继承了前面描述的istream和ostream类的功能
fstream类:
-- fstream类支持磁盘文件输入和输出
-- 如果需要在同一个程序中从一个特定磁盘文件读写并写到该磁盘文件,可以构造一个fstream对象
-- 一个fstream对象是有两个逻辑子流的单个流,两个子流一个用于输入,另一个用于输出
stringstream类
-- stringstream类支持面向字符串的输入和输出,可以用于对同一个字符串的内容交替读写,同样是由两个逻辑子流构成