2. 输入输出 类的继承
ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类
类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了 类iostream
iostream头文件中4种流对象
iostream头文件中4种流对象
对象 |
含义 |
对应设备 |
对应的类 |
c语言中相应的标准文件 |
cin |
标准输入流 |
键盘 |
istream_withassign |
stdin |
cout |
标准输出流 |
屏幕 |
ostream_withassign |
stdout |
cerr |
标准错误流 |
屏幕 |
ostream_withassign |
stderr |
clog |
标准错误流 |
屏幕 |
ostream_withassign |
stderr |
3、标准输入流 cin
重点掌握的函数
cin.get()
可以接受空格 读取成功返回非零值,若失败(如遇见了结束符EOF)
则返回非零值 , >> 在默认情况下拒绝接受空白字符
cin.getline()
只能输入字符
常用形式
cin. getline(字符数组,字符个数,终止标志符)
或
cin. getline(字符指针,字符个数,终止标志符)
cin.ignore()
跳过输入流中的n个字符默认为一个 或遇见指定字符(默认为EOF)提前结束
调用形式
cin.ignore(n,终止字符)
cin.ignore(10,'t') //跳过10个字符 或遇见 ‘t’ 就不再跳了
可以不带参数
cin.ignore() //相当于 cin.ignore(1,EOF)
cin.peek() //检查下一个输入的字符,不会把字符从流中移除
cin.putback() //返回一个字符给一个流
重要
1、使用cin,从流中读出的字符,流中就没有这字符了,再次读取时只能读取剩下的
2、缓冲去只有在遇到EOF、手动敲回车、流(缓存区)满时,才将流中的字符全部读出(即清空缓存区)
4、标准输出流 cout
cout.put() //把字符写入流中 eg : cout.put(60+20)
cout.write() //将字符串写入当前输出流中
cout.flush() //清空缓冲区
cout补充
1、用“cout<<”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型 并根据其类型选择调用与之匹配的运算符重载函数。这个过程都是自动的,用户不必干预。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应的输出格式符,十分麻烦,而且容易出错
2、cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插 人一个endl时, 不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符, 并刷新流(清空缓冲区)。注意如果插人一个换行符”\n“(如cout< 3、在iostream中只对"<<“和”>>“运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出 进行重载。 如果用户声明了新的类型,并希望用”<<“和”>>"运算符对其进行输入输出,按照重运算符重载来做。
4. cout 流通常是传送到显示器输出,但也可以被重定向 输出到磁盘文件,而cerr流中的信息只能在显示器输出cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出
5.iOS类有关控制符 流成员函数
设置状态标志
格式
long ios::setf(long flags)//将某一状态标志位置“1”
一般形式
流对象.setf(ios::状态标志)
istream isobj;
isobj.setf(ios::skipws);//跳过输入的空白
isobj.setf(ios::left)// 设置左对齐
多个标识符用|隔开
cout.setf(ios::hex|ios::basefield);
清除状态标志·
一般格式
long ios:: unsetf(long flags);
调用格式
流对象.unsetf(ios::标志状态符);
设置域宽
成员函数为width
int ios :: width(int n);
设置实数精度
int ios::precision(int n);
填充字符
char ios:: fill(char ch);
需注意:
1、fmtflags setf( fmtflags flags ); 使用这种,一定要先取消当前基【cout.unself()】,之后才可以设置新的基
2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用这种,第二个参数设为当前的基,或者当不知道当前基时,设为ios_base::basefield清除当前的所有可能的基
6.c++预定义的操纵符
操纵符 |
功能 |
输入/输出 |
dec |
设置整数基数为10 |
输出和输入 |
hex |
设置整数基数为16 |
输出和输入 |
oct |
设置整数基数为8 |
输出和输入 |
ws |
跳过输入的空格符 |
输入 |
endl |
输出一个换行符并刷新输出流 |
输出 |
ends |
插入一个空字符null,通常用来结束一个字符串 |
输出 |
flush |
刷新一个输出流 |
输出 |
setbase(n) |
设置整数的基数为n(可取0或10代表十进制,8代表八进制和16代表十六进制,默认为0) |
输入和输出 |
setfill(c) |
设置填充符(默认为空格) |
输出 |
setprecision(n) |
设置实数精度n,原理和成员函数precision一样 |
输出 |
setw(n) |
设置域宽n |
输出 |
setiosflags(flags) |
设置指定状态标志,多个用 分隔符 分隔 |
输出和输入 |
resetiosflags(flags) |
清除指定状态标志,多个用 分隔符 分隔 |
输出和输入 |
操作符setiosflags(flags)和resetiosflags(flags)的部分状态标志:
操纵符 |
功能 |
setiosflags(ios::left) |
数据左对齐 |
setiosflags(ios::right) |
数据右对齐 |
setiosflags(ios::fixed) |
固定小数位数 |
setiosflags(ios::scientific) |
浮点数以科学记数法(指数)显示 |
setiosflags(ios::showpos) |
在正数前面添加一个“+”号 |
setiosflags(ios::uppercase) |
以科学表示法格式E和以十六进制输出字母时用大写表示 |
resetiosflags(ios::) |
终止已设置的状态标志 |
输出流自定义操纵符
ostream &操纵符名(ostream &s)
{
自定义代码
return s;
}
输入流自定义操纵符
istream &操纵符名(istream &s{
自定义代码
return s;
}
7.用户自定义输入输出
重载插入运算符
格式
ostream &operstor <<(ostream &out,user_name & obj)
{
out<
重载提取运算符
istream &operator>>(istream &in,user_name &obj)
{
in>>obj.item1;
in>>obj.item2;
.
.
.
in>>obj.item;
return in;
}
以上两个重载函数均不能是所操作类的成员函数,但是可以是该类的友元函数或普通函数。
8.文件原理
进行文件的输入输出前要建立一个流对象,流对象与文件相关联。
建立流的过程,就是定义流对象,,cin cout已经在头文件里定义了
ifstream in;
ofstream out;
fstream both;
文件打开将文件与一个流对象建立联系,一般是用成员函数open打开文件的
若文件存在则打开文件,否则建立该文件
格式
文件流对象.open(文件名,打开方式);
out.open("test.dat",ios::out);
由于输入输出都有自己的默认的形式
ifstream 的默认形式是 ios::in
ofstream 的默认形式是 ios::out
所以可以简写成为
out.open("test.dat");
文件的多种打开方式
frestream mystream;
mystream.open("test.dat",ios::in|ios::out|ios::binary);
定义对象时 调用构造函数打开文件
ofstream out ("test.dat");
等价于
ofstream out;
out.open("test.dat");
说明 文件打开失败的时候 与文件联系的流对象的值将会是0
if(!out)
{
cout<<"cannot open file!\n";
}
文件关闭
out.close();
文件的读写
#include
#include
using namespace std;
int main()
{
ofstream fout ("f2.text",ios::out);
//定义文件 fout 打开输出文件f2.dat
if(!fout)
{
cout<<"cannot open file!\n";
return 1;
}
fout<<"I_love_you \n";//向文件里输入字符串
fout<<520<<" "<>str>>i;//从f2 中读取内容
cout<
打开方式:
方式 |
作用 |
ios::app |
以输出方式打开文件,写入的数据添加在文件末尾 |
ios::ate |
打开一个已有的文件,文件指针指向文件末尾 |
ios::in |
以输入方式打开文件 |
ios::nocreate |
打开一个已有的文件,如文件不存在,则打开失败。nocreate的意思就是不建立新文件 |
ios::noreplace |
如果文件不存在则建立新文件,如果文件已存在则操作失败,noreplace的意思是不更新原有文件 |
ios::out |
以输出方式打开文件(这是默认方式),如果已有此名字的文件,则将其原有内容全部清除 |
ios::trunc |
打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了ios::out方式,而未指定ios::app、ios::ate、ios::in,则隐含为此方式 |
ios::binary |
以二进制打开文件,默认文件为文本形式打开。用文本文件向计算机输入时,回车和换行 ,转换为一个换行符 , 输出时,又转回来,对二进制文件则不进行此转换。 |
ios::in\ios::out |
以输入和输出方式打开文件,文件可读写 |
ios::out\ios::binary |
以二进制的方式打开一个输出文件 |
ios::in\ios::binary |
以二进制的方式打开一个输入文件 |
文件打开时都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。(有的文件两个字节存一个字符,当设定的指针在奇数位上,容易产生乱码)当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节)
文件关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出
文件类型:
1、ASCII文件:文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。
2、二进制文件:文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件