函数重载:
Record(int &);
Record(const int &);//新函数
指向函数的指针:
Bool (*pf)(const string &,const string&)
这个语句将pf声明为指向函数的指针,它所指向的函数带两个const string&类型的形参和bool类型返回值。
而*pf两侧的圆括弧是必须的;
Bool *pf (const string &,const string&)//它定义的是,返回bool指针类型的函数。
标准io类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型;fstream定义读写已命名文件的类型;而sstream所定义的类型则是用于读写存储在内存中string对象。再过fstream和sstream里定义的每种类型都是从iostream件中定义相关类型派生而来。
Io标准库的条件状态:
Strm::iostate 机器相关整型名,有哥哥iostream类定义,用于定义条件状态
Strm::badbit strm::iostare类型的值,用于指出被破坏的流;
Strm::failbit strm::iostare类型的值,用于指出失败的io操作
Strm::eofbit strm::iostare类型的值;用于指出流已经到达文件结束符
s.eof()如果设置了流s的eofbit值,则该函数返回ture/是否到达文件的结束符/
s.fail()’如果设置了流s的failbit值,该函数返回true//是否输入无效
s.bad()如果设置了流s的badbit值,该函数返回true//检查流是否已破坏
s.good()如果流s处于有效状态,则该函数返回true
s.clear()将流s正的所有状态值都重设为有效状态
s.clear(flag)将流s中的某个指定条件状态设置为有效,flag的类型是strm:iostate
s.setstate(flag)给流s 添加指定条件
s.rdstate()返回流s的当前条件,
例如:
Int ival;
While(cin>>ival,!cin.eof())//直到文件结束符才结束
{
If(cin.bad())//如果流已破坏则抛出异常
Throw runtime_error(“IOstream corrupted”);
If(cin.fail)//如果读取失败
{
Cerror<<”baddata ,try again”;
Cin.clear(istream::failbit);
Continue;
}
……
}
cerr与cout的区别
cout对应于标准输出流,默认情况下是显示器。这是一个被缓冲的输出,可以被重定向。
cerr对应标准错误流,用于显示错误消息。默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向。
例如下面代码编译后生成test.exe
//test.cpp
#include<iostream>
usingnamespace std;
intmain()
{
cout<< "hello world---cout" << endl ;
cerr<< "hello world---cerr" << endl ;
return0;
}
在命令行模式下键入下面的命令:
test>>cout.txt
运行结果是:
在生成的cout.txt文件中输出了"helloworld---cout" ,
同时在显示器上输出了"hello world---cerr" ,
也就是说cout的输出可以重定向到一个文件中,而cerr必须输出在显示器上。
文件的输入和输出:
文件模式:
In 打开文件做读操作
Out打开文件做些操作
App在每次写之前找到文件尾
Ate打开文件后立即将文件定位在文件尾
Trunc打开文件时清空以存在的文件流
Bitnary以二进制模式进行io操作
默认时与ifstream流对象关联的文件将以in模式打开,该模式允许文件做读的操作
与ofstream关联的文件默认则以out模式打开。使文件可写。以out模式打开的文件会被清空,丢弃该文件存储的所有数据。
从效果上看,为ofstream对象指定out模式等效于同时指定了out和trunc模式
对于用ofstream打开的文件,要保存文件已存在的数据,唯一的方法是显式的指定app模式打开。
如:ofstream outfile(“file”);//默认以out模式打开
与ofstreamoutfile(“file”,ofstream::out| ofstream::trunc);等价
Ofstream appfile(“file2”,ofstream::app); 保存文件已存在的数据
对同一个文件做输入输出操作
Fstream对戏那个集可以读也可以写它所关联的文件,fstream如何使用它的文件取决于打开文件指定的模式。
默认情况下,fstream对象以in和out模式同时打开,当文件已in和out打开时不清空,如果打开fstream所关联的文件时,值使用out 模式,而不指定in模式,则文件会清空以存在的数据,如果打开文件时指定了trunc模式,则无论是否同时指定了in模式,文件同样被清空,
在c++总,有一个stream这个类,所有的io都以这个刘类为基础的,包括我们要认识的文件io,stream这个类有两个重要的运算符:
1, 插入器(<<)
向流输出数据,比如说系统有一个默认的标准输出流(out),一般情况下就是指的显示器,所以,cout<<”write stdout”;就表示吧字符串输出到标准输出流(显示器)
2, 析取器(>>)
从流中输入数据,比如系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就是表示从标准输入流中读取一个指定类型的数据。
C++中对文件的操作时通过stream的子类fstream来实现的,所以要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件擦偶偶过程一一道来。
1,打开文件
在fstream类中,有一个成员函数open,就是用来打开文件的,其原型是:
Void open(const char* filename ,intmode,int access);
参数:
Filename:要打开的文件名
Mode:要打开文件的方式
Access:打开文件的属性
打开文件属性取值是:
0:普通文件,打开访问
1:只读文件
2:隐含文件
4:系统文件
例如:以二进制输入方式打开文件C:config.sys
Fstream file1;
File1.open(“c:\config.sys”,ios::binary|ios::in,0);
如果open函数只有文件名一个参数,则是以读写普通文件打开即:
File1.open(“c:\config.sys”)==file1.open(“c:\cnfig.sys”,ios::in|ios::out,0);
另外,fstream还有海open()一样的构造函数,对于上例,在定义的时候就可以打开文件了:
Fstream file1(“c:\config.sys”);
特别提醒的是,fsteam有两个子类:ifstream(input file stream);和ofstream(output filestream);
Ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件
Ifstreamfile2(“c:\pdos.def”);已输入凡是打开文件、
Ofstreamfile3(“c\x.123”);以输出方式打开文件
所以在实际应用中个人扭矩需要的不同,选择不同的类来定义,如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义,如果想以输入输出的方式来打开文件,就用fstream来定义
二:关闭文件
打开文件使用完成后一定要关闭,fstream提供了成员函数close来完成此操作,如:file.close();就把file1相连的文件关闭。
三,读写文件
读写文件分为文本和二进制文件的读取,对于文本文件的读取标胶简单,用插入器和析取器就可以了,而对于二进制的读取就要复杂些,下面要详细的介绍着两种方式
1, 文本文件的读写
文本文件的读写很监督:用插入器(<<)向文件输出,用析取器(>>)从文件输入,假设file1是以输入方式打开,file2以输出打开,实例如下:
File2<<”ILove you”;//向文件写入字符串”I love you ”
Int I;
File1>>I;//从文件输入一个整数值
这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有一下一些操纵符功能输入输出
Dec格式化为十进制数值数据输入和输出
Endl输出一个换行符并刷新此流输出
Ends处处一个空字符 输出
Hex格式化为十六进制数值数据 输入和输出
Oct格式化为八进制数值数据 输入和输出
Setpxecision(int p);
比如哟啊吧123当做十六进制输出:file1,<</p>;
2, 二进制文件的读写
1, put()
put()函数向流写入一个字符,其原型是ofstream &put(char ch).使用液比较简单,如file1.put(‘c’);就是向流写入一个字符‘c’
2, get()
get()函数比较灵活,有3种常用那个的重载形式:
一种就是和put()对应的形式ifstream &get(char &ch);,功能就是从流中读取一个字符,结果保持你在引用ch中如果到文件尾,返回空字符,如file2.get(x)表示从文件中读取一个字符,并把读取的字符保存在x中,
另一种从不在的原型是:intget();这种形式是从流中返回一个字符,如果到达文件尾,分那会EOF,如x=file2.get();
还有一种形式的原型是:ifstream &get(char *buf,int num,char delin=’’);这种形式吧字符读入有buf指向的数组,直到读入num个字符或遇到delin指定的字符,如果没有delin这个参数,将使用缺省换行符‘’。例如
File2.get(str1,127,’A’);//从文件中读取字符到字符串str1,当遇到字符A或读取127个字符时终止
3, 读写数据块
要读取二进制数据块,使用成员函数read()和write()成员函数,他们原型如下:
Read(unsigned char*buf,int num);
Write(constunsigned char *bur ,int num);
Read()从文件中读取num个字符到buf指向的缓存中,如果在还未读入num个字符时就到了文件尾,可以用成员函数int gcount()来取得实际读取的字符数,而write()从buf指向缓存写num个字符到文件中明智的注意的时缓存的类型是unsigned char *,有时可能需要类型转换
例如:unsigned char str1[]=”I love you ”;
Int n[5];
Ifstream in(“in.txt”);
Ofstrem out(“out.tex”);
Out.write(str1,strlen(str1));//把字符串str1全部写到out.txt
In.read((unsignedchar*)n,sizeof(n),sizeof(n))//从in.txt中读取指定个整数,注意类型转换,
In.close();out.close();
四,检测EOE
成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0.原型是int eof();例如:if(in.eof())showMessae(“已经到达文件尾部”);
五.文件定位:
和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:
istream &seekg(streamoff offset,seek_dir origin);
ostream &seekp(streamoffoffset,seek_dir origin);
streamoff定义于 iostream.h中,定义有偏移量 offset所能取得的最大值,seek_dir表示移动的基准位置,是一个有以下值的枚举:
ios::beg: 文件开头
ios::cur: 文件当前位置
ios::end: 文件结尾
这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。
例:
file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节
file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节