C++输入输出流
一、关于C++ IO库
1.引言
? c++使用类型安全的IO流操作,不同类型的IO流操作都是重载的,没有定义过IO功能的类型不具备IO操作能力。
? 通过修改 和扩充,C++既可以为标准数据类型的IO,也能用于自定义类型的IO,这种扩展性是C++最有价值的特点之一。
? 所谓流stream是指数据从一个未知流向另一个位置,流是字节的序列。
? 输入输出是一种数据传递操作,可以看作字符序列在计算机内存与外设之间的流动,c++将数据从一个对象到另一个对象的流动称为流。
2.IO流库的层次结构
? ·C++ IO流库中有两个平行基类:
? streambuf
? ios
? ios直接派生类:
? ·输入流类istream
? ·输出流类ostream
? ·文件流类基类fstreambase
? ·字符串流类基类strstreambase
3.IO流库的头文件
? iostream:包含了对输入输出流进行操作的基本信息,还包括cin、cout、cerr、clog
? fstream:用于用户管理文件的IO操作
? strstream:用于字符串流IO
? stdiostream:用于混合使用C和C++的IO操作
? iomanip:用于格式化IO
二、无格式输入输出
? 无格式IO就是按照系统预定义的格式进行输入输出
? cin用于处理标准输入,即键盘输入
? cout用于处理标准输出,即屏幕输出
? 原函数:
ostream cout(stdout);
istream cin(stdin);
? 重载运算符>>和<<:
cin>>E1>>E2;
cout<<E<<E2<<endl;//endl用于换行
三、C++的格式化输入输出
1.方式一 用流对象的成员函数格式化
? 流成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入、输出格式化。
? 输入输出的格式由各种状态标志来决定,在ios类中定义为枚举量。
? 因为定义在ios类中,引用时必须包含ios::前缀。使用时全用符号名,不能用数值。
//设置状态标志的函数
long ios::setf(long flags);
//清除状态标志的函数
long ios::unsetf(long flags);
//用函数flags取状态标志的两种形式:
long ios::flags();
long ios::flags(long flag);
//用于设置输出宽度(只对其后的第一个输出项有效)
int ios::width(int len);//设置输出宽度,并返回原输出宽度
int ios::width();//返回当前输出宽度,默认输出宽度为0
//设置填充字符(当输出值不满输出宽度时用填充字符填充,故需要与width函数配合使用)
char ios::fill(char ch);//设置填充字符,并返回设置前的填充字符
char ios::fill();//返回当前填充字符
//设置输出精度(默认为6)
int ios::precision(int p);//重新设置输出精度
int ios::precision();//返回当前输出精度
//输出单个字符:
char ios::put();
//读入一个字符(若遇到文件结束符,函数的返回值就是读入的字符,遇到输入流文件结束符返回EOF)
char ios::get();
char ios::get(char ch);//读入的参数赋值给ch
void ios::get(char *ch,int n,char end);//在遇到end字符前读n-1个字符赋值给*ch
//读入一行字符
void ios::getline(char *ch,int n,char end);
? istream其他成员函数
bool eof();//表示文件结束
char peek();//观察返回下一个字符,观察指的是流指针位置不变
void putback();//将前面用get或getline读取的字符插入到当前流指针位置
void ignore(int n,char end);//跳过n个字符,遇到end不继续跳
void ignore();//ignore(1,EOF)
? 以上函数的使用:
<流对象名>.<函数名>(ios::<状态标志>);
cout.setf(ios::showpos);//设置状态标志showpos
cout.unsetf(ios::showpos);//删除状态标志showpos
cout.with(10);//设置宽度十
cout.put('a').put(97);//输出aa
cin.get(ch,20,'\n');//读到换行符号之前读19个字符给ch
cin.eof();//文件结束返回true
cin.peek();//观察返回下一个字符
cin.ignore(5,'A');//跳过五个字符,遇到A不继续跳
2.方式2:用控制符格式化
//设置输入输出宽度setw(int)
//只对后边第一个输入输出有效
//实际宽度小向右对其
//反之按数据实际宽度输出
cout<<E1<<setw(6)<<E2<<setw(4)<<E3;
//设置填充字符setfill(char)
//设置后直到下一次设置前一直有效
cout<<E1<<setfill('a')<<E2<<setfill('b')<<E3;
//设置输出精度setprecision(int)
//参数为0默认六位输出
cout<<E1<<setprecision(6)<<E2<<setprecision(4)<<E3;
//设置标志setiosflags(long flag)
cout<<setiosflags(ios::fixed)<<E;
//设置终止输出格式resetiosflags()
cout<<resetiosflags();
//设置输入输出整数数制dec hex oct
//换行控制符endl
//输出单字符控制符ends
? 用户自定义控制符:
ostream &<控制符函数名>(ostream stream){
//自定义语句
return stream;
}
istream &<控制符函数名>(istream stream){
//自定义语句
return stream;
}
3.flags:
flag参数 | 作用 |
---|
ios::fixed | 定点数表示实数 | ios::scientific | 科学计数法表示实数 | ios::left | 左对齐 | ios::right | 右对齐 | ios::uppercase | 大写表示 | ios::showpos | 输出正数时给出+ | ios::skipws | 忽略前导空格 |
四、文件的输入输出
1.文件
? C++把文件看作是一个字符(字节)的序列,即由一个个字符(字节)顺序组成;
? 根据数据组织形式,可分为ASCII文档和二进制文件
2.文件流
? iostream->fstream
? istream->ifstream (mod值ios::in)
? ostream->ofstream (mod值ios::out)
void open(char *filename,int mod);//使用open()函数简历或打开一个文件
void close();//使用close()函数关闭一个文件
void read(char *ch,int len);//读入len个字符
void write(char *ch,int len);//读入len个字符
//示例
#include<iostream>
#include<fstream>
using namespace std;
int main(){
char s[100];
ofstream ostrm;
ostrm.open("f1.txt",ios::out);
ostrm.write(s,10);
ostrm<<120<<endl;//写操作
ostrm.close();
ifstream istrm;
istrm.open("f2.txt",ios::in);
cin>>s;
istrm.read(s,10);
istrm.close();
}
五、字符串流(内存流)
1.特点
? 以字符数组作为输入输出对象
? 具有相应缓冲区
? 在字符数组中可以存放字符,也可以存放整数、浮点数
2.原型
ostrstream::ostrstream(char *buffer,int n,int mod=ios::out);
istrstream::istrstream(char *buffer,int n);
istrstream::istrstream(char *buffer);
|