输入输出流
输入输出的含义:
从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。
程序的输入:从文件传送给程序。
程序的输出:从程序传送给文件。
分类:
1、标准I/O 键盘输入 显示器输出
2、文件I/O 外存输入 外存输出
3、字符串I/O 内存输入 内存输出
C语言回顾
int i= 1; //假定占2字节
printf("%d",i); //正确输出
printf("%d",f); //f为float型,只输出f变量的前两个字节
printf("%d","C++"); //输出字符串的起始地址
scanf("%d",&i);//将内容写入变量i
scanf("%d",i);//将内容写入内存地址为i的地方
C++的输入输出中,编译系统对数据类型进行严格的检查。
C++的I/O操作是类型安全的。 type safe
——————————————————————————————
流stream
输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。
流表示了信息从源到目的端的流动。
实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。
流是与缓冲区相对应的。
缓冲区中的数据就是流。
输入输出流被定义为类
I/O库中的类被称为流类 stream class
用流类定义的对象被称为流对象
ios
istream ostream fstreambase strstreambase
iostream ifstream istrstream ofstream ostrstream istream_withassign ostream_withassign
fstream strstream iostream_withassign
与iostream类库有关的头文件
iostream 包含输入输出流的基本信息
fstream 文件I/O
strstream 字符串I/O
stdiostream 用于混合使用C和C++的I/O机制:例如想将C程序转变为C++程序
iomanip 使用格式化I/O时应包含此头文件
在iostream头文件中定义的类:
ios istream ostream iostream istream_withassign ostream_withassign istream_withassign
在iostream头文件中定义的对象:
cin istream_withassign类对象 stdin
cout ostream_withassign类对象 stdout
cerr ostream_withassign类对象 stderr
clog ostream_withassign类对象 stderr
—————————————————————————————
标准输出流
cout流对象
console output
1、cout是流对象
2、自动判断输出类型
3、在内存中自动开辟缓冲区,插入endl时输出缓冲区中的所有数据,并刷新流。
“\n”没有此效果(不是所有编译系统都体现这一区别)
cerr流对象
console error
向标准出错设备 standard error device 输出有关出错信息
和cout的不同:
cout可以被重定向输出到磁盘文件
cerr不能重定向,只能在显示器输出
clog流对象
console log
标准出错流 作用与cerr相同
与cerr区别:
cerr不经过缓冲区
clog有缓冲区
——————————————————————————————
格式输出
|--使用控制符
|--使用流对象的有关成员函数
使用控制符控制输出格式:
头文件iomanip
dec hex oct
setbase(n)
setfill(c)
setprecision(n)
setw(n)
setiosflags(ios::fixed)
setiosflags(ios::scientific)
setiosflags(ios::left)
setiosflags(ios::right)
setiosflags(ios::skipws)
setiosflags(ios::uppercase)
setiosflags(ios::showpos)
resetioflags()
用流对象的成员函数控制输出格式
cout中的成员函数
precision(n)
width(n)
fill(c)
setf()
unsetf()
格式标志在ios中被定义为枚举值
ios::left
ios::right
ios::internal
ios::dec
ios::oct
ios::hex
ios::showbase
ios::showpoint
ios::uppercase
ios::showpos
ios::scientific
ios::fixed
ios::unitbuf 每次输出后刷新
iso::stdio 每次输出后清除stdout stderr
说明:
1、成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效
2、输出格式状态分为5组,每组中只能一个生效
3、用setf函数设置格式状态时,可以包含两个或多个格式标志
这些格式标志在ios类中被定义为枚举值,每一个格式标志以一个二进位代表
可以用“位或”运算符“|”组合多个格式标志
cout.setf(ios::internal | ios::showpos);
用控制符更为方便
——————————————————————————————
用流成员函数put输出字符
专用于输出单个字符的成员函数put
cout.put('a'); //字符
cout.put(65+32); //ASCII码
cout.put(71).put(79).put(79).put(68).put('\n');// GOOD
C语言中,putchar()定义在stdio.h中
C++中,putchar()定义在iostream中
———————————————————————————
标准输入流 键盘
>> 流提取符 终止标志:输入流中的white space(空格 tab 换行)
只有输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输出流,提取运算符">>"才能从中提取数据。
cin
正常状态:1 true
出错状态:0 false 无效字符 文件结束符
文件结束符
IBM PC Ctrl+Z
Unix Ctrl+D
用于字符输入的流成员函数
get的3种形式
|--cin.get() 返回读入的字符 遇EOF结束 C语言中的getchar()功能相同
|--cin.get(ch) 返回bool值 C语言中的getchar(ch)
|--cin.get(字符数组,字符个数,终止字符) 读取n-1个字符赋给字符数组,终止字符默认为'\n'
getline(字符数组,字符个数,终止字符)
和cin.get的不同,cin.get在终止字符之前停止,getline在终止字符之后停止
>>可读取标准类型
getline只能操作字符
eof函数 end of file
cin.eof() 末尾为真
peek函数
cin.peek() 观察下一字符而指针不动
putback函数
cin.putback(ch) 将字符ch插入到当前指针位置,以供后面读取
ignore函数
cin.ignore(n,终止字符)
cin.ignore(5, 'A') //跳过输入流中的5个字符,遇A终止跳跃
cin.ignore() //等同于 cin.ignore(1,EOF)
——————————————————————————————
文件操作与文件流
文件的概念:file 存储在外部介质上数据的集合
操作系统以文件为单位对数据进行管理
文件分类:
|--程序文件 program file .cpp .obj .exe
|--数据文件 data file
在程序运行时,将一些数据输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存
组织形式划分:
|--ASCII文件 字符文件
|--二进制文件 字节文件
int i = 100;
低级I/O 二进制形式 不进行数据格式转换
高级I/O 字符串形式 将数据从内存送到显示器输出
——————————————————————————————
输出文件流:从内存流向外存文件的数据
输入文件流:从外存文件流向内存的数据
文件流类
ifstream ASCII 二进制 文件输入
ofstream ASCII 二进制 文件输出
fstream 二进制文件输入输出
必须事先定义流对象
cin cout cerr clog 是在iostream中已经定义好的流对象
ofstram outfile;//定义输出文件流对象
文件的打开与关闭
文件流对象.open(磁盘文件名,输入输出方式);
outfile.open("f1.dat",ios::out);
ofstream outfile("f1.dat",ios::out);
输入输出方式在ios类中定义,是枚举常量
ios::in
ios::out
ios::app
ios::ate
ios::trunc
ios::binary
ios::nocreate 新版C++不提供
ios::noreplace 新版C++不提供
ios::in | ios::out
ios::out |ios::binary
ios::in | ios::binary
每打开一个文件都有一个文件指针
打开操作失败,返回0
构造函数失败,返回0
关闭磁盘文件
outfile.close();
C语言,exit() 函数定义在 stdlib.h中
—————————————————————————————
对ASCII文件的操作的两种操作
|-- << >>
|--get getline
put
对二进制文件的操作
将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映象文件 又称为字节文件。
在打开时要用ios::binary指定为二进制形式传送和存储。
二进制文件可以既能输入,又能输出——与ASCII文件不同的地方。
用fstream定义输入输出的二进制文件
用成员函数read write 读写
istream& read(char *buffer, int len);
ostream& write(const char *buffer, int len);
与文件指针有关的流成员函数
二进制文件允许对指针进行控制,以便在该位置上进行读写
gcout()
tellg()
seekg(文件中的位置)
seekg(位移量,参照位置)
tellp()
seekp(文件中的位置)
seekp(位移量,参照位置)
位移量 和 参照位置 为long型整数,以字节为单位
参照位置:在ios中定义的枚举常量
ios::beg
ios::cur
ios::end
—————————————————————————
字符串流
以内存中用户定义的字符数组(字符串)为输入输出的对象
内存 <-> 缓冲区 <-> 数组
二进制 ASCII ASCII
istrstream
ostrstream
strstream
不需要打开和关闭字符串流
自定义结束标志
输出字符串流对象
ostrstream构造函数原型
ostrstream::ostrstream(char * buffer, int n, int mode = ios::out);
//第三个参数默认为ios::out
//n 缓冲区大小(与数组可以相同,也可以不同)
ostrstream srtout(ch1, 20);
输入字符串流对象
istrstream::istrstream(char * buffer);
istrstream::istrstream(char * buffer, int n);
istream strin(ch2);
istream strin(ch2,20);
输入输出字符串流对象
strstream::strstream(char * buffer, int n, int mode);
strstream strio(ch3, sizeof(ch3), ios::in | ios::out);
明天二级 2016-3-25
来源:oschina
链接:https://my.oschina.net/u/2669173/blog/647536