(1)对系统指定的标准设备的输入和输出 标准 I/O
(2)以外存磁盘为对象的输入和输出 文件I/O
(3)内存中空间进行输入和输出 字符串I/O
当用cout和插入运算符向显示器输出数据时,先把数据送到输出缓冲区,直到满了或者遇到endl,将缓冲区的全部数据送到显示器显示出来
流:缓冲区的数据
注:
cout和cin并不是c++提供的语句,是iostream类的对象
ios 抽象基类
istream 输入流基类
ostream 输出流基类
iostream 输入和输出流基类
ifstream 输入文件流类
ofstream 输出文件流类
fstream 输入输出文件类
istrstream 输入字符串类
ostrstream 输出字符串类
strstream 输入输出字符串类
istream 输入输出的基本操作
fstream 用户管理的文件I/O操作
strstream 字符串流I/O
stdiostream 混合使用c和c++的I/O机制
iomanip 格式化的头文件
cin 输入流 (键盘输入)
cout 输出流(显示器)
cerr 错误流(显示器)
clog 错误流(显示器)
ostream operator<<(int);//用于输出流中插入Int数据
ostream 定义了三个输出流对象 cout (不是c++的关键字)cerr clog
cout 如果出现 endl 则输出所有数据的同时刷新流,即为清空缓冲区,但是换行符只换行不刷新流
cerr 输出错误信息
clog 在缓冲区中,缓冲区满后或者遇到endl时从显示器输出
使用控制符或者流对象的成员函数
cout.put(34);
put函数用于输出单个字符
cin流 只有输入完数据按回车键后,该行数据才被送到键盘缓冲区,形成输出流
如果遇到无效字符或者遇到文件结束符时,输入处于出错状态
get 函数
(1)
cin .get();
//不带参数
文件结束标志 EOF
(2)有一个参数
cin .get(ch);
(3)有三个参数的get 函数
cin.get(字符数组,字符个数,终止字符)
getline 函数 用于输入一行字符
cin.getline(字符数组,字符个数,结束标志)
(1)
eof 函数
文件结束,函数非0为真否则为假
cin.eof()调用形式
(2)peek 函数
cin.peek();调用形式
观测函数
(3)putback函数
cin.putback();调用形式插入当前位置以供后面读取
(4)ignore 函数
cin.ignore(n,终止字符)跳过输入流中的n个字符遇到指定字符时不再跳跃
使用
举例: get函数只能从键盘输入字符不能输入一行字符,也就是说遇到空格会终止读取,假如使用了ignore函数就可以解决这个问题
文件:储存在外部介质上数据的集合
文件按组织形式分类为 二进制文件和ASCII文件
对于字符,两者输出的数据形式是相同的,但是对于数值数据,两者是不同的
文件流是以外存文件为输入输出的数据流,文件流本身不是文件,只是以文件为输入输出对象的流
建立一个输出流对象
ofstream outfile;
(1)为文件流和指定的磁盘文件建立关联
(2)指定文件的工作方式
eg:
ofstream outfile;//定义对象
outfile.open("f1.dat",ios::out); 使文件与f1.dat文件建立关联
(3)输入输出方式设置
ios::in 以输入的方式打开文件
ios::out 以输出的方式打开文件
ios::app 以输出的方式打开文件,写入的数据增添在文件尾
ios::ate 打开一个已有的文件,文件指针指向文件末尾
ios::trunc 打开一个文件,如果文件存在,则删除所有数据,否则,建立新文件
ios::binary 以二进制的方式打开文件
ios::nocreate 打开已存在的文件,如果不存在,则打开失败,不建立新文件
ios::noreplace 如果文件不存在,建立新文件,存在则操作失败。noreplace 意思是不更新原有文件
ios::in|ios::out 以输入和输出的方式打开文件,文件可读写
ios::out|ios::binary 以二进制的形式打开输出文件
ios::in|ios::binar 以二进制的形式打开一个输入文件
可以进行组合操作
outfile.close()//将输出流所关联的磁盘文件关闭
实际就是解除该磁盘文件与文件流的关联
Outfile.open("f2.dat",ios::app|ios::nocreate);
此时文件流与f2.dat建立关联,并指定了它的工作方式
16对ASCII文件的操作
对ASCII文件的读写操作可以用以下两种方式
(1)
<<和>>输入输出标准类型的数据
(2)
用文件流等成员函数进行字符的输入和输出
eg 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中进行存放
#include
#include
using namespace std;
int main()
{
int a[10];
ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件
加粗部分的程序可写可不写,看情况
if(!outfile) //如果打开失败
{
cerr<<"open error!" <
}
cout<<"请输入10个数字"<
{
cin>>a[i];
outfile<向磁盘中输出数据,加空格是为了分隔数据,否则,数字连成一片无法区别
outfile.close() ;//关闭文件
return 0;
}
建立数据文件,从中读10个整数放在数组中,并找出10个数中的最大值和它的下标序号
#include
int main()
{
int a[10];
int max,i,order;
ifstream infile ("f1.dat",ios::in|ios::nocreate);//定义输入文件流对象,以输入的方式打开对象
if(!infile)
{
cerr<<"open error"<
}
for(int i=0;i<10;i++)
{
infile>>a[i];//从磁盘读10个数字,顺序放在a数组后面
cout< cout<
order=0;
for(int i=0;i<10;i++)
{
if(a[i]>max)
{
max=a[i];
order=i;//储存最大数的下标
}
}
cout<
infile.close();//文件关闭
return 0;
}
从键盘中读入一行数字,把字母字符放在磁盘文件中,再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件中
#include
using namespace std;
void save_to_file()//从键盘读入一行数据区,将其存在磁盘文件中
{
ofstream outfile("f2.dat") ;
//定义输出文件流,以输出方式打开磁盘文件
if(!outfile)
{
cerr<<"打开失败"<
}
char c[80];
cin.getline(c,80);//从键盘读入一行数据
for(int i=0;c[i]!=0;i++)
{
//对字符逐个处理,直到遇到结束标志为止
if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122) //如果是字符
{
outfile.put(c[i]) ;//将字母字符存入磁盘文件
cout<
cout<
}
outfile.close();//关闭
}
//从磁盘文件中读入字母字符,将小写字母改为大写字母
void get_from_file()
{
char ch;
ifstream infile("f2.dat",ios::in|ios::nocreate);
if(!infile)
{
cerr<<"打开错误"<
}
ofstream outfile("f3.dat");//定义输出文件流,以输出的方式打开
if(!infile)
{
cerr<<"打开错误" <
}
while (infile.get(ch))
{
if (ch>=97&&ch<=122)//判断是否为小写字母
ch=ch-32;//将小写变为打下
outfile.put(ch) ;//将大写字母存到磁盘文件中
cout<
cout<
outfile.close();//关闭磁盘文件f3.dat
}
int main()
{
save_to_file();
get_from_file();//函数调用
return 0;}
文件也要打开和关闭
打开 ios::binary
(1)用read 和write 读写二进制文件
将一批数据以二进制的形式存放在磁盘文件中
#include
using namespace std;
struct student
{
char name[20];
int num;
int age;
char sex;
};
int main()
{
student stud[3]={"li",1001,12,"f","fun",1002,12,"m","wang",1003,14,"f"};
ofstream outfile("stud.dat",ios::binary);
if(!outfile)
{
cerr<<"打开错误"<
}
for(int i=0;i<3;i++)
{
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close();
return 0;
}
}
17 字符串流
文件流以外存文件为输入输出对象的数据流,而字符串是以用户自己定义的数组类型为对象
将数据输出到内存中的字符数组,或者从字符数组中将数据读入,也称为内存流
也有缓冲区
字符数组中可以存放字符,也可以存放整数,浮点数和其他类型的数,存入时,要先将数据从二进制转换ASCII代码,然后放在缓冲区,再从缓冲区送到字符数组
从字符数组中读取时,现将字符数组中的数据送到缓冲区,将ASCII码转换成二进制的形式
与文件流的三个不同
(1)输出时数据是流向内存的储存空间
(2)字符串流对象关联的不是文件,是内存中的字符数组
不需要打开和关闭文件
(3)用户需要自己定义一个特殊的字符作为结束标志
建立 字符串输出流对象
ostrstream strout(chl,20) ;
字符串对象与数组chl关联,缓冲区大小为20
建立 字符串输入流对象
ostrstream strin(chl,20) ;
字符串对象与数组chl关联,缓冲区大小为20
建立 字符串输出流对象
ostrstream strio(ch3,sizeof(ch3),ios::in|iosout);