1.printf和scanf函数的缺陷
(1)非类型安全。
(2)不可扩充性。
2.流的概念
(1)流的引入
scanf("%d",&a); cin>>a;
printf("%d",a); cout<<a;
(2)流的基本概念
流:数据从一个对象流动到另一个对象,这种流动抽象为流。
流的操作:建立流、删除流、提取(读操作/输入)、插入(写操作/输出)。
3. C++流的继承结构
ios:对流状态进行设置,虚基类;
streambuf:提供对数据的缓冲支持;
istream、ostream、iostream:提取与插入
4.字符串类
提供处理内部初始化字符序列的操作;
istrstream:从序列中取字符;
ostrstream:将字符放入序列;
6. 预定义的流
cin:istream类对象,处理标准输入,即键盘输入;
cout:ostream类对象,处理标准输出,即屏幕输出;
cerr:ostream类对象,处理标准出错信息,提供不
带缓冲区的输出;
clog:ostream类对象,处理标准出错信息,提供带
缓冲区的输出;
7.预定义插入符的格式
(1)ostream& ostream::operator <<(const type& obj);
(2)其中:type为char、int、short、long类型和它们的unsigned和signed类型,以及float、double、long double、char *和void *;
(3)插入运算符后可以是任意复杂的表达式,系统可自动计算其值并传给插入符;
(4)指针类型的地址值,默认为十六进制显示,用long强制转换后才可以十进制显示;
8.函数的使用:
(1)使用get()获取一个字符
istream& istream::get(char& c);
int istream::get();
(2)使用getline()获取多个字符
istream& istream::getline(char *buf,int Limit,Deline='n');
说明;A.getline()最多可读取Limit-1个字符;
B.getline()函数结束操作的条件:从输入流中读取Limit-1个字符后;从输入流中读取换行符或其他终止符后;从输出流中读取到文件或输入流结束符后;
(3) 使用read()读取一串字符: istream& istream::read(char *,int);
8.如何控制输出格式
c++中有两种格式控制格式输出:
(1) 流对象的成员函数。
(2) 使用控制符。
9.文件的概念
在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成
10.文件的类型
按存储格式分为两种类型,一种为字符格式文件(文本文件),另一种为内部字节文件(二进制文件)。
11. 文件流对象
要用#include<fstream>命令。
它提供的输入文件流类:ifstream
输出文件流类:ofstream
输入输出文件流类:fstream
定义用户所需要的文件流对象,然后利用open成员函数,按照一定的方式打开一个文件。文件被打通过流对象访问其中内容,结束后用close关闭。
12.如何正确的使用流的打开和关闭?
(1)流可以分为3类:输入流、输出流以及输入/输出流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。例如:
ifstream ifile; //说明一个输入流对象
ofstream ofile; //说明一个输出流对象
fstream iofile; //说明一个输入/输出流对象
(2)用open()来打开文件。即在流与文件之间建立一个连接。
open()的函数原型为:
void open(const char * filename,int mode,int prot=filebuf::openprot);
(3)相关参数说明
Filename:文件名,它可包含路径说明。
Mode:文件打开的模式
方式 |
意义 |
ios::in |
打开文件进行读操作 |
ios::out |
打开文件进行写操作 |
ios::ate |
打开时文件指针定位到文件尾 |
ios::app |
添加模式,所有增加都在文件尾部 |
ios::trunc |
如果文件已存在则清空原文件 |
ios::nocreate |
如果文件不存在则打开失败 |
ios::binary |
二进制文件(非文本文件) |
(4) 对于ifstream流,mode的默认值为ios::in;
对于ofstream流,mode的默认值为ios::out。
(1) 文件保护方式选择项
标志 |
含义 |
filebuf::openprot |
兼容共享方式 |
filebuf::sh_none |
独占,不共享 |
filebuf::sh_read |
允许读共享 |
filebuf::sh_write |
允许写共享 |
(2) mode的符号常量可以“|”组合在一起,如 ios::in|ios::binary表示以只读方式打开二进制文件。
13. 文件的读写方法
(1)使用流运算符直接读写
可以直接使用流的“<<”和 “>>”,完成文件的字符转换工作。
(2)使用流成员函数
输出流成员函数为:put函数、write函数
输入流成员函数有:get函数、getline函数、read函数
14. 二进制文件的读写操作
(1)用write()往文件写入n个字节
原型:ostream& ostream::write(char *buf ,int n);
(2)用read()从文件读取n个字节
综合举例:
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;
class Person
{
private:
string name;
int age;
public:
Person(string name,int age):name(name),age(age)
{
;
}
Person()
{
;
}
//必须重载输出流。
friend ostream & operator<<(ostream &of,const Person &p)
{
of<<p.name<<" "<<p.age<<endl;
return of;
}
// 重载输入流:
friend istream & operator>>(istream &in, Person &p)
{
in>>p.name>>p.age;
return in;
}
//重载<操作符:
friend bool operator<(const Person&p1,const Person &p2)
{
return (p1.name<p2.name);
}
};
int main(void)
{
//定义一个输出文件流。
ofstream out("person.txt");
if(out.fail())
{
cout<<"open person.text fail"<<endl;
return 0;
}
//定义一个文件流的迭代器:
ostream_iterator<Person> ofile(out);
//定义一个对象的数组:
Person persons[]={Person("ibm",30),Person("db2",45)};
//定义对象容器:
vector<Person> vp(persons,persons+sizeof(persons)/sizeof(persons[0]));
//容器内的所有的数据写入文件流的迭代器:
copy(vp.begin(),vp.end(),ofile);
ifstream in;
//打开文件的另一种方式:
in.open("person.txt");
//判断是否打开成功的一种方式。
if(!in)
{
cout<<"open person.text fail"<<endl;
return 0;
}
//一个输入流的迭代器:
istream_iterator<Person> infile(in);
istream_iterator<Person> eos;
//定义向量容器:
vector<Person> vp2;
//从文件读取内容到vp2中,并依次插入到vp2的后面。
copy(infile,eos,inserter(vp2,vp2.begin()));
//对读入的容器vp2进行排序:
sort(vp2.begin(),vp2.end());
//输出到屏幕:
copy(vp2.begin(),vp2.end(),ostream_iterator<Person>(cout));
//使用输入输出流的函数:
cin.get();
return 0;
}