首页 理论教育 C++STL:简单高效的标准模板库

C++STL:简单高效的标准模板库

时间:2023-10-25 理论教育 版权反馈
【摘要】:能够取代标准流操作符“>>”和“<<”的部分成员函数一般用于读写无格式数据。输入read()函数是和输出write()函数对应的。输入的二进制数据是存入缓冲区中的,并且会包括数据中的空格。

C++STL:简单高效的标准模板库

能够取代标准流操作符“>>”和“<<”的部分成员函数一般用于读写无格式数据。通常,在读取数据时,不跳过起始空格,对异常的处理方式也不同于格式化I/O函数;发生意外(异常)后,badbit通常会设立。若异常掩码中包含badbit,则会重新抛出该异常。和格式化函数一样,无格式相关函数会产生一个sentry(岗哨)对象。本小节主要讲述类is- tream的成员函数和类ostream的成员函数。

1.输入函数

istream是用于输入的一个流类。此外,类wistream和basic_istream模板类也适用于输入操作。C++STL中用于读取字符序列的成员函数主要包括get(s,num)、get(s,num,t)、getline(s,num)、getline(s,num,t)、read(s,num)和readsome(s,num)。

输入运算符“>>”在使用时,所输入的字符串前面的空格通常会自动跳过。当在屏幕的某行输入字符时,只有那些非空字符才能进入接收字符的变量中。尤其在实现输入数值类型的数据时,如果在非起始位置出现空格字符,输入将停止。此空格之后的文字或字符会被读取到下一个存储流的对象中,并且中间的空格会自动消失。

对于命名空间std中的ios::skipws标志,是不能对“>>”运算符起作用的。如果要保留输入序列中的空格,需要使用get()函数或getline()函数。

命名空间istream类的成员read()函数主要用于实现输入功能,通常会用于文件的读写操作中。输入read()函数是和输出write()函数对应的。输入的二进制数据是存入缓冲区中的,并且会包括数据中的空格。

get()函数的原型为:

978-7-111-51399-5-Chapter07-28.jpg

978-7-111-51399-5-Chapter07-29.jpg

第一种形式返回从流中读入的字符序列;第二种形式返回流中读入的字符序列,读入的数据存储在字符型数组pch中,函数结束的条件是:已经输入了nCount-1个字符,遇见回车换行符'\n';或者遇见文件尾标志end-of-file。第三种形式和第二种形式近似,只不过输入的数据流存储在无符号型字符数组puch中。第四种形式和第二种型式近似,只不过输入的数据流存储在有符号型字符数组psch中。第五种形式表示从输入流中提取单个字符,并存储在rch中;第六种形式和第五种形式近似,表示从输入流中提取单个字符,并存储在无符号字符型变量ruch中;第七种形式表示从输入流中抽取单个字符,存储在有符号字符变量rsch中;第八种形式表示从输入流中抽取字符序列,并存储在streambuf型对象中,抽取时遇'\n'或遇见文件结束标志eof时,抽取过程终止。

getline()函数的原型为:

978-7-111-51399-5-Chapter07-30.jpg

第一种形式实现从输入流中抽取字符序列,并保存在字符型数组pch中。抽取过程的终止条件是:已经输入了nCount-1个字符,遇见回车换行符'\n'或者遇见文件尾标志end-of-file。

第二种形式和第三种形式均与第一种形式近似。

read()函数的原型为:

978-7-111-51399-5-Chapter07-31.jpg

以上给出三种型式的read()函数原型。第一种形式实现读取nCount个字符,并存储在字符串pch中,返回数据流,数据流的状态可表明读取工作是否成功。

需要注意:在读入过程中,字符串pch中的字符不会由于字符终止符号结束。必须确保字符串pch的容量大于nCount个字符。读取过程中,如果遇见eof标识会出现错误,failbit和eofbit会被设置。

第二种形式、第三种形式和第一种形式近似。

readsome()函数的原型为:

978-7-111-51399-5-Chapter07-32.jpg

上述函数最多可读入count个字符,并存储在字符串str中。其返回值是读取的字符个数。str内的字符串不会自动以字符串终止符号结束。使用时,程序员需要确保字符串str中留有足够的空间,能够保存count个字符。

和read()函数不同,readsome()函数会读取stream buffer内的所有有效字符,遇到文件末尾标志eof时,不会报错,并且不设置标志位eofbit和failbit。

另外输入函数还包括gcount()、ignore()、peek()、unget()、putback()、tellg()和seekg()函数。

gcount()函数返回上次“非格式化读取操作”所读入的字符个数。

ignore()有3种形式,所有形式均可实现提取字符,并将这些字符舍弃不用。其函数原型为:

978-7-111-51399-5-Chapter07-33.jpg

在使用过程中,程序员可使用如下3种形式:

978-7-111-51399-5-Chapter07-34.jpg(www.xing528.com)

peek()函数用于返回输入序列中下一个被读入的字符,但并不读取该字符,若输入序列中没有数据,则返回eof。其原型为:

978-7-111-51399-5-Chapter07-35.jpg

unget()函数将上一次读取的字符重新放回stream中,下一次从输入流中读取时,便可以将这些字符读取出来。

tellg()和seekg()函数主要用于文件输入/输出。后面会有所描述。

2.输出函数

命名空间std中包含输出函数,可以实现把字符和存储块写入至输出流对象中,同时也可以选择使用重载“<<”插入运算符把字符和存储块写至输出流对象中。put()函数把单个字符写至输出流中,还有另外两个write()函数和flush()。

put()函数的原型为:

978-7-111-51399-5-Chapter07-36.jpg

put()函数用于实现将参数c写入流中。其返回值的状态可表明写入是否成功。write()函数的原型为:

978-7-111-51399-5-Chapter07-37.jpg

上述3种形式均可将字符串pch(或puch,psch)中的nCount个字符写入输出流中。

其返回值类型为输出流类型,返回流的状态字可说明该写入操作是否成功。值得注意的是,字符串终止符号不会终止写入操作。且程序员必须确保字符串中至少包含nCount个字符,否则会导致不可预期的行为。

flush()函数的原型为:

978-7-111-51399-5-Chapter07-38.jpg

函数flush()用于刷新stream的缓冲区,将所有缓冲区数据强制写入其所属的设备或I/O通道。另外,tellg()和seekg()函数用以改变写入位置,主要与文件I/O有关。

例7-4

978-7-111-51399-5-Chapter07-39.jpg

例7-4的执行效果如图7-1所示。

978-7-111-51399-5-Chapter07-40.jpg

图7-1 例7-4的执行效果

例7-5

978-7-111-51399-5-Chapter07-41.jpg

978-7-111-51399-5-Chapter07-42.jpg

978-7-111-51399-5-Chapter07-43.jpg

例7-5的执行效果如图7-2所示。

978-7-111-51399-5-Chapter07-44.jpg

图7-2 例7-5的执行效果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈