Ø 程序中,对数据的输入/输出是以字节流实现的
Ø 应用程序对字节序列作出各种数据解释
Ø I/O系统的任务就是在内存和外部设备之间稳定可靠地传输数据 和解释数据。
Ø 流类对象可以建立和删除,可以从流中获取数据和向流添加数据
Ø流类库(stream library)是用继承方法建立的输入输出类库
Ø 流库具有两个平行的基类:streambuf 和 ios 类,所有流类均以两者之一作为基类
Ø streambuf 类提供对缓冲区的低级操作,如 设置缓冲区 对缓冲区指针操作 向缓冲区存/取字符
Ø ios 类及其派生类提供用户使用流类的接口,支持对streambuf 的缓冲区输入/输出的格式化或非格式化转换
Ø iostream.h 包含操作所有输入/输出流所需的基本信息含有cin、cout、cerr、clog对象,提供无格式和格式化的I/O
Ø iomanip.h 包含格式化I/O操纵算子,用于指定数据输入输出的格式
Ø fstream.h 处理文件信息,包括建立文件,读/写文件的各种操作接口
(1) cin istream 类的对象,通常连向键盘,可以重定向
(2) cout ostream 类的对象,通常连向显示器,可以重定向
(3) cerr ostream 类的对象,连向显示器。不能重定向
(4) clog ostream 类的对象,连向打印机。不能重定向
函数 |
功能 |
read istream& read ( char* pch, int nCount ); istream& read ( unsigned char* puch, int nCount ); istream& read ( signed char* psch, int nCount ); |
无格式输入指定字节数 |
get int get(); istream& get( char* pch, int nCount, char delim = '\n' ); istream& get( unsigned char* puch, int nCount, char delim = '\n' ); istream& get( signed char* psch, int nCount, char delim = '\n' ); istream& get( char& rch ); istream& get( unsigned char& ruch ); istream& get( signed char& rsch ); istream& get( streambuf& rsb, char delim = '\n' ); |
从流中提取字符,包括空格 |
getline istream& getline( char* pch, int nCount, char delim = '\n' ); istream& getline( unsigned char* puch, int nCount, char delim = '\n' ); istream& getline( signed char* psch, int nCount, char delim = '\n' ); |
从流中提取一行字符 |
ignore istream& ignore( int nCount = 1, int delim = EOF ); |
提取并丢弃流中指定字符 |
peek int peek(); |
返回流中下一个字符,但不从流中删除 |
gcount int gcount() const; |
统计最后输入的字符个数 |
eatwhite void eatwhite(); |
忽略前导空格 |
seekg istream& seekg( streampos pos ); istream& seekg( streamoff off, ios::seek_dir dir ); |
移动输入流指针 |
tellg streampos tellg(); |
返回输入流中指定位置的指针值 |
operstor>> basic_istream& operator>>( basic_istream& (*pf)(basic_istream&)); basic_istream& operator>>( basic_ios basic_istream& operator>>( ios_base basic_istream& operator>>( basic_streambuf basic_istream& operator>>(bool& n); basic_istream& operator>>(short& n); basic_istream& operator>>(unsigned short& n); basic_istream& operator>>(int& n); basic_istream& operator>>(unsigned int& n); basic_istream& operator>>(long& n); basic_istream& operator>>(unsigned long& n); basic_istream& operator>>(void *& n); basic_istream& operator>>(float& n); basic_istream& operator>>(double& n); basic_istream& operator>>(long double& n); |
提取运算符 |
函数 |
功能 |
put ostream& put( char ch ); |
无格式,插入一个字节 |
write ostream& write( const char* pch, int nCount ); ostream& write( const unsigned char* puch, int nCount ); ostream& write( const signed char* psch, int nCount ); |
从无格式,插入一字节序列 |
flush ostream& flush(); |
刷新输出流 |
seekp ostream& seekp( streampos pos ); ostream& seekp( streamoff off, ios::seek_dir dir ); |
移动输出流指针 |
tellp streampos tellp(); |
返回输出流中指定位置的指针值 |
operstor<< basic_ostream& operator<<( basic_ostream& (*pf)(basic_ostream&)); basic_ostream& operator<<( basic_ios basic_ostream& operator<<(const char *s); basic_ostream& operator<<(char c); basic_ostream& operator<<(bool n); basic_ostream& operator<<(short n); basic_ostream& operator<<(unsigned short n); basic_ostream& operator<<(int n); basic_ostream& operator<<(unsigned int n); basic_ostream& operator<<(long n); basic_ostream& operator<<(unsigned long n); basic_ostream& operator<<(float n); basic_ostream& operator<<(double n); basic_ostream& operator<<(long double n); basic_ostream& operator<<(void *n); |
插入运算符 |
标识常量 |
值 |
意义 |
goodbit |
0x00 |
状态正常 |
eofbit |
0x01 |
文件结束符 |
failbit |
0x02 |
I/O操作失败,数据未丢失,可以恢复 |
badbit |
0x04 |
非法操作,数据丢失,不可恢复 |
函数 |
功能 |
int eof() const; |
返回eofbit状态值。文件结束符时返回1,否则返回0 |
int fail() const; |
返回failbit状态值 |
int good() const; int operator void *() ; |
eofbit、failbit和badbit都没有被设置,则返回1 |
int bad() const; int operator !() ; |
eofbit、failbit或badbit其中一个被设置,则返回1 |
int rdstate() const; |
返回状态字 |
void clear( int nState = 0 ); |
恢复或设置状态字 |
函数 |
功能 |
long flags( long lFlags ); long flags() const; |
用参数lFlags更新标志字 返回标志字 |
long setf( long lFlags ); long setf( long lFlags, long lMask ); |
设置lFlags指定的标志位 将lMask指定的位清0,然后设置lFlags指定位 |
long unsetf( long lMask ); |
将参数lMask指定的标志位清0 |
int width( int nw ); |
设置下一个输出项的显示宽度为nw |
char fill( char cFill ); |
空白位置以字符参数cFill填充 |
int precision( int np ); |
用参数np设置数据显示精度 |
控制符 |
功能 |
输入/输出 |
endl |
输出一个新行符,并清空流 |
O |
ends |
输出串结束符,并清空流 |
O |
flush |
清空流缓冲区 |
O |
dec |
用十进制表示法输入或输出数值 |
I/O |
hex |
用十六进制表示法输入或输出数值 |
I/O |
oct |
用八进制表示法输入或输出数值 |
I/O |
ws |
提取空白字符 |
I |
iomanip控制符 需要#include
控制符 |
功能 |
输入/输出 |
resetiosflags ( ios::lFlags ) |
清除lFlags指定的标志位 |
I/O |
setiosflags ( ios::lFlags ) |
设置lFlags指定的标志位 |
I/O |
setbase ( int base ) |
设置基数,base = 8,10,16 |
I/O |
setfill ( char c ) |
设置填充符c |
O |
setprecision ( int n ) |
设置浮点数输出精度 |
O |
setw ( int n ) |
设置输出宽度 |
O |
Ø 串流类是 ios 中的派生类
Ø C++的串流对象可以连接string对象或字符串
Ø 串流提取数据时对字符串按变量类型解释;插入数据时把类型 数据转换成字符串
Ø 串流I/O具有格式化功能
Ø C++把文件看成无结构的字节流, 编码方式: 文本文件 二进制文件 存取方式: 顺序文件 随机文件
Ø ifstream、ofstream 和 fstream 类用于内存与文件之间的数据传输
包括 建立文件流对象;与外部文件关联;指定文件的打开方式;而打开文件有两种方法:
Ø 首先建立流对象,然后调用fstream::open()函数连接外部文件
流类 对象名 ; 对象名 . open ( 文件名 , 方式 ) ;
Ø 调用流类带参数的构造函数,建立流对象的同时连接外部文件
流类 对象名 ( 文件名 , 方式 ) ;
Ø 文件流的构造函数和 open ( ) 函数用于打开文件,析构函数在流对象被删除之前关闭文件
打开文件参数
标识常量 |
值 |
意义 |
ios::in |
0x0001 |
读方式打开文件 |
ios::out |
0x0002 |
写方式打开文件 |
ios::ate |
0x0004 |
打开文件时,指针指向文件尾 |
ios::app |
0x0008 |
追加方式 |
ios::trunc |
0x0010 |
删除文件现有内容 |
ios::nocreate |
0x0020 |
如果文件不存在,则打开操作失败 |
ios::noreplace |
0x0040 |
如果文件存在,则打开操作失败 |
ios::binary |
0x0080 |
二进制方式打开,默认为文本方式 |
Ø 关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志, 切断流对象和外部文件的连接
Ø 若流对象的生存期没有结束,可以重用
Ø 当一个流对象的生存期结束,系统也会自动关闭文件
Ø 文本文件用默认方式打开
Ø 文本文件用文本文件流进行读/写操作
Ø 文本文件是顺序存取文件
Ø 描述一个对象的信息称为一个记录
Ø 文本文件本身没有记录逻辑结构
Ø 通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行符、制表符等分隔
PS:get ( ) 和 getline ( ) 异同:
istream & istream :: get ( char * , int , char = '\n' ) ;
istream & istream :: getline ( char * , int , char = '\n' ) ;
第一个参数指向接受字符数据的字符数组;第二个参数指定字符数组最多可容纳的字符个数;第三个参数用于指定一个终止符,缺省为换行符操作遇到终止符或提取到规定个数字符时,提取终止。
作用:从文本中提取指定个数的字符,并在串数组末添加一个空字符
区别:get ( ) 不从流中提取终止字符,终止字符仍在输入流中 getline ( ) 从流中提取终止字符,但终止字符被丢弃
Ø 二进制文件以基本类型数据在内存的二进制表示形式存放 数据,不对写入或读出的数据做格式转换
Ø 二进制文件的读写方式由程序控制
Ø 打开二进制文件用binary方式
Ø 二进制文件是随机存取文件
Ø istream & istream :: seekg ( long pos) ; 作用 读指针从流的起始位置向后移动由pos指定字节
Ø istream & istream :: seekg ( long off, ios::seek_dir ) ; 作用 读指针从流的seek_dir位置移动 off 指定字节
Ø istream & istream :: tellg () ; 作用 返回读指针当前所指位置值
Ø ostream & ostream :: seekg ( long pos) ; 作用 写指针从流的起始位置向后移动由pos指定字节
Ø ostream & ostream :: seekg ( long off, ios::seek_dir ) ; 作用 写指针从流的seek_dir位置移动 off 指定字节
Ø ostream & ostream :: tellg () ; 作用 返回写指针当前所指位置值
PS: ios::seek_dir 值: enum ios::seek_dir { beg = 0 ; cur = 1 , end = 2 }
cur 相对于当前读指针所指定的当前位置 beg 相对于流的开始位置 end 相对于流的结尾处
PS2: 这些函数操作对象是单字节数据,它们也可以用于文本流,但必须保证流中存储数据是ASCII码,并且不会跳过空白字符
istream & istream :: get ( char & c ) ; 作用 从流中提取一个字节数据,更新对象 c
int istream :: get ( ) ; 作用 函数值返回流中一个字节数据
istream & istream :: read ( char * buf , int n ) ; 作用 从流中提取 n 个字节数据,更新对象 buf
ostream & ostream :: put ( char c ) ; 作用 向流插入一个字节数据
ostream & ostream :: write ( char * buf , int n ) ; 作用 向流插入 buf 对象的由第二个参数指定数目的字节数据
Ø 流对象是内存与文件(或字符串)之间数据传输的信道。
Ø 数据流本身没有逻辑格式。数据的解释方式由应用程序的操作决定。流类库提供了格式化和非格式化的I/O功能。
Ø 文本流I/O提供内存基本类型数据与文本之间的格式转换。
Ø 处理用户定义的文件I/O要用文件流对象。根据代码方式分为文本文件和二进 制文件,根据数据存取方式分为顺序存取文件 和随机存取文件。
Ø 文件操作的三个主要步骤是:打开文件;读/写文件;关闭文件。
Ø 文件的性质由打开文件的方式决定。移动流指针,可以对文件的任意位置进行读/写操作。
PS:科学计数法表达形式: 1.xxx e +/- xxx
紫色为精度,蓝色为次方。
cout< cout< 资料参考 《C++程序设计》 周霭如