C++标准IO库

本文介绍了C++标准IO库,包括面向对象的标准库、条件状态管理、输出缓冲区的控制,详细阐述了文件的输入输出操作及模式,以及字符串流的使用和转换格式化功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准IO库

1.      面向对象的标准库

标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO),还定义了其他一些类型,使string对象能够像文件那样进行操作,从而使我们无需IO就能够实现数据与字符串之间的转换。

>> 操作符,用于从istream对象中读入输入。

<< 操作符,用于把输出写到ostream对象中。

 

 

 

2.      条件状态

IO标准库管理了一系列条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了那种特定的错误。

在需要更加详细的访问或控制流的状态时,除了知道流处于的错误状态外,还必须了解它遇到了那种类型的错误。

所有的流对象都包含一个条件状态成员,该成员由setstate和clear操作管理,这个状态成员为iostream类型,

IO标准库的条件状态

IO标准库的条件状态

strm::iostate

机器相关的整型名,由各个iostream类型定义,用于定义条件状态

strm::badbit

strm::iostate类型的值,用于指出被破坏的流

strm::failbit

strm::iostate类型的值,用于指出失败的IO操作

strm::eofbit

strm::iostate类型的值,用于指出流已经达到文件结束符

s.eof()

如果设置了流s的eofbit值,则该函数返回true

s.fail()

如果设置了流s的failbit值,则该函数返回true

s.bad()

如果设置了流s的badbit值,则该函数返回true

s.good()

如果流s处于有效状态,则该函数返回true

s.clear()

将流s中的所有状态值都重设为有效状态

s.clear(flag)

将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate

s.setstate(falg)

给流s添加指定条件。flag的类型是strm::iostate

s.rdstate()

返回流s的当前条件,返回值类型为strm::iostate

 

 

 

 

 

3. 输出缓冲区的管理

每个IO对象管理一个缓冲区,用于存储程序读写的数据。

缓冲区的内容被刷新,即写入到真实的输出设备或文件中。

以下几种情况是缓冲区刷新的情况:

1.      程序正常结束,作为main返回工作的一部分,清空所有输出缓冲区

2.      在一些不确定的时候,缓冲区可能已经满了,这时,缓冲区将会在写下一个值之前刷新。

3.      用操作符显式的刷新缓冲区,如行结束符endl

4.      在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区。

5.      可将输出流与输入流关联(tie)起来。这种情况下,在读输入流时将刷新其关联的输出缓冲区。

 

 

4.文件的输入和输出

提供三种头文件支持文件IO类型

ifstream提供读文件功能

ostream 提供写文件的功能

fstream 提供读写同一个文件的功能

fstream定义了两个新操作----open和close,以及形参为要打开的文件名的构造函数

需要读写文件时,必须定义自己的对象,并将它们绑定在需要的文件上。例如ifile和ofile是希望读写的文件名的string对象,则

ifstream infile(ifile.c_str());

ofstream outfile(ofile.c_str());

首先需要定义自己的对象infile和outfile,然后将它们绑定在读写的文件上,ifile,ofile是文件名。

 

 

 

5.文件模式

再打开文件时,无论是调用open还是以文件名作为流初始化的一部分,都需要指定文件模式,每个fstream类都定义了一组表示不同模式的值,用来指定流打开的不同模式。

文件模式

in

打开文件做读操作

out

打开文件做写操作

app

在每次写之前找到文件尾

ate

打开文件后立即将文件定位在文件尾

trunc

打开文件时清空已存在的文件流

binary

以二进制模式进行IO操作

 

与ifstream流对象关联的文件将以in模式打开,该模式允许文件做读的操作;与ofstream关联的文件则以out模式打开,使文件可写。以out模式打开的文件会被清空:丢弃该文件存储的所有数据。

 

1.对同一文件做输入和输出运算,

fstream inOut(”copyOut”, fstream::in | fstream::out);

当文件同时以in和out打开时不清空,

2.      模式是文件的属性而不是流的属性

每次打开文件时都要设置模式。只要调用open函数,就要设置文件模式,其模式的设置可以是显式的也可以是隐式的。若没有指明文件模式,则是默认值。

 

3.      打开模式的有效组合

文件模式的组合

out

打开文件做写操作,删除文件中已有的数据

out | app

打开文件做写操作,在文件尾写入

out | trunc

与out模式相同

in

打开文件做读操作

in | out

打开文件做读写操作,并定位于文件开头处

in | out |trunc

打开文件做读写操作,删除文件中已有的数据

 

 

 

6.字符串流

iostream标准库支持内存中的输入和输出,只要将流与存储在程序内存中的string对象捆绑起来即可。此时,可使用iostream输入和输出操作符读写这个string对象。

标准库定义三种类型的字符串流

istringstream,由istream派生而来,提供读string的功能。

ostringstream,由ostream派生而来,提供写string的功能。

stringstream,有iostream派生而来,提供读写string的功能。

要使用上述类,必须包含sstream头文件。

stringstream特定的操作

stringstream strm

创建自由的stringstream对象

stringstream strm(s)

创建存储s的副本的stringstream对象,其中s是string类型的对象

strm.str()

返回strm中存储的string类型对象

strm.str(s)

将string类型的s复制给strm,返回void

 

1.stringstream对象的使用;

       对每行中的每个单词进行操作实现。可以使用stringstream对象实现。

 

       程序读取整行的内容,然后为了获得每行中的单词,将一个istringstream对象与所读取的行绑定起来,这样只需要使用普通的string输入操作符即可读出每行中的单词。

代码示例:

string line, word;

while(getline(cin, line))

{

       istringstreamstream(line);

       while(stream>> word) //从行line中读取每一个单词word

       {

              //

}

}

 

 

2.stringstream提供的转换和格式化

stringstream对象的一个常见用法就是,需要在多种数据类型之间实现自动格式化时使用该类类型。例如,有一个数值型数据集合,要获取他们的string类型表达式,或反之。sstream输入和输出操作可自动地吧算术类型转化为相应的string表示形式,反过来也可以。

       intval1 = 512, val2 = 1024;

       ostringstreamformat_message;

 

       format_message<< “val1:” << val1 << “\n” << “val2” << val2<< ‘\n”;

       用istringstream读string对象,即可重新将数值类型数据找回来。读取istringstream对象自动地将数值型数据的字符表示方式转换为相应的算术值。

       istringstreaminput_istring(format_message.str());

       stringdump;

 

       input_istring>> dump >> val1 >> dump >> val2;

       cout<< val1 << “ ” << val2 << endl;

       这里使用str成员获取与之前创建的ostringstream对象关联的string副本。再将input_istring与string绑定起来。在读input_istring时,相应的值恢复为他们原来的数值型表示方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值