C++ 之 输入输出流 相关知识点整理

一、流类与流对象。

1.基础概念

Ø 程序中,对数据的输入/输出是以字节流实现的

Ø 应用程序对字节序列作出各种数据解释

Ø I/O系统的任务就是在内存和外部设备之间稳定可靠地传输数据 和解释数据。

Ø 流类对象可以建立和删除,可以从流中获取数据和向流添加数据

2.流类库

Ø流类库(stream library)是用继承方法建立的输入输出类库

Ø  流库具有两个平行的基类:streambuf 和 ios 类,所有流类均以两者之一作为基类

Ø  streambuf 类提供对缓冲区的低级操作,如   设置缓冲区  对缓冲区指针操作  向缓冲区存/取字符

                    C++ 之 输入输出流 相关知识点整理

Ø   ios 类及其派生类提供用户使用流类的接口,支持对streambuf 的缓冲区输入/输出的格式化或非格式化转换

            C++ 之 输入输出流 相关知识点整理

3.头文件

Ø  iostream.h  包含操作所有输入/输出流所需的基本信息含有cincoutcerrclog对象,提供无格式和格式化的I/O

Ø  iomanip.h  包含格式化I/O操纵算子,用于指定数据输入输出的格式

Ø  fstream.h  处理文件信息,包括建立文件,读/写文件的各种操作接口

 

二、标准流和流操作

1.标准流

(1)  cin  istream 类的对象,通常连向键盘,可以重定向

(2)  cout  ostream 类的对象,通常连向显示器,可以重定向

(3)  cerr  ostream 类的对象,连向显示器。不能重定向

(4)  clog  ostream 类的对象,连向打印机。不能重定向

 

2.istream类(输入流)

2.1 成员函数及功能

函数

功能

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<E, T>& (*pf)(basic_ios<E, T>&));

basic_istream& operator>>( ios_base<E, T>& (*pf)(ios_base<E, T>&));

basic_istream& operator>>( basic_streambuf<E, T> *sb);

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);

提取运算符

3.ostream类(输出流)

3.1 成员函数及功能

函数

功能

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<E, T>& (*pf)(basic_ios<E, T>&)); basic_ostream& operator<<( ios_base<E, T>& (*pf)(ios_base<E, T>&)); basic_ostream& operator<<( basic_streambuf<E, T> *sb);

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);

插入运算符

 

4.错误流

4.1错误流状态及处理函数

标识常量

意义

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 *() ;

eofbitfailbitbadbit都没有被设置,则返回1

int bad() const;

int operator !() ;

eofbitfailbitbadbit其中一个被设置,则返回1

int rdstate() const;

返回状态字

void clear( int nState = 0 );

恢复或设置状态字

 

三、格式控制

1.格式状态字及相关函数

       C++ 之 输入输出流 相关知识点整理

函数

功能

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设置数据显示精度

 

2.格式控制符

控制符

功能

输入/输出

endl

输出一个新行符,并清空流

O

ends

输出串结束符,并清空流

O

flush

清空流缓冲区

O

dec

用十进制表示法输入或输出数值

I/O

hex

用十六进制表示法输入或输出数值

I/O

oct

用八进制表示法输入或输出数值

I/O

ws

提取空白字符

I

 

iomanip控制符 需要#include <iomanip>

控制符

功能

输入/输出

resetiosflags ( ios::lFlags )

清除lFlags指定的标志位

I/O

setiosflags ( ios::lFlags )

设置lFlags指定的标志位

I/O

setbase ( int base )

设置基数,base = 81016

I/O

setfill ( char c )

设置填充符c

O

setprecision ( int n )

设置浮点数输出精度

O

setw ( int n )

设置输出宽度

O

 

四、串流

1.相关概念

Ø 串流类是 ios 中的派生类

Ø C++的串流对象可以连接string对象或字符串

Ø 串流提取数据时对字符串按变量类型解释;插入数据时把类型    数据转换成字符串

Ø 串流I/O具有格式化功能

 

五、文件输入输出

1.相关概念

Ø C++把文件看成无结构的字节流, 编码方式: 文本文件      二进制文件         存取方式: 顺序文件      随机文件

Ø ifstreamofstream fstream 类用于内存与文件之间的数据传输

 

2.打开文件

包括   建立文件流对象;与外部文件关联;指定文件的打开方式;而打开文件有两种方法:

Ø 首先建立流对象,然后调用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

二进制方式打开,默认为文本方式

 

3.关闭文件

Ø 关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志,   切断流对象和外部文件的连接

Ø 若流对象的生存期没有结束,可以重用

Ø 当一个流对象的生存期结束,系统也会自动关闭文件

 

4.文本文件

Ø 文本文件用默认方式打开

Ø 文本文件用文本文件流进行读/写操作

Ø 文本文件是顺序存取文件

Ø 描述一个对象的信息称为一个记录

Ø 文本文件本身没有记录逻辑结构

Ø 通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行符、制表符等分隔

 

PS:get ( ) 和  getline ( ) 异同:

istream & istream :: get ( char * ,  int ,  char = '\n' ) ;

istream & istream :: getline ( char * ,  int ,  char = '\n' ) ;

第一个参数指向接受字符数据的字符数组;第二个参数指定字符数组最多可容纳的字符个数;第三个参数用于指定一个终止符,缺省为换行符操作遇到终止符或提取到规定个数字符时,提取终止。

作用:从文本中提取指定个数的字符,并在串数组末添加一个空字符

区别:get ( ) 不从流中提取终止字符,终止字符仍在输入流中   getline ( ) 从流中提取终止字符,但终止字符被丢弃

 

5.二进制文件

Ø 二进制文件以基本类型数据在内存的二进制表示形式存放 数据,不对写入或读出的数据做格式转换

Ø 二进制文件的读写方式由程序控制

Ø 打开二进制文件用binary方式

Ø 二进制文件是随机存取文件

 

5.1 istream 类操作流读指针的成员函数

Ø istream & istream :: seekg ( long  pos) ;                                作用  读指针从流的起始位置向后移动由pos指定字节

Ø istream & istream :: seekg ( long off, ios::seek_dir ) ;           作用  读指针从流的seek_dir位置移动 off 指定字节

Ø istream & istream :: tellg () ;                                                  作用  返回读指针当前所指位置值

 

5.2 ostream 类操作流读指针的成员函数

Ø 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码,并且不会跳过空白字符

 

5.3  类操作字节数据的成员函数

istream & istream :: get ( char & c ) ;                                   作用    从流中提取一个字节数据,更新对象 c

int  istream :: get ( ) ;                                                           作用    函数值返回流中一个字节数据

istream & istream :: read ( char * bufint  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<<setiosflags(ios::fixed)<<setprecision(3)    指小数点后精度  

cout<<setprecision(3)                                          指全部数精度  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

资料参考 《C++程序设计》 周霭如