文档章节

C++ Primer Plus(十七)——输入、输出和文件

吃一堑消化不良
 吃一堑消化不良
发布于 2017/11/04 08:31
字数 3391
阅读 18
收藏 0

1. cerr和clog对象与标准错误流对应,但cerr不被缓冲。

2. streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法。ios_base类表示流的一般特征(是否可读取?二进制流?等,ios类基于ios_base,包含一个指向streambuf的指针成员

 

3. ostream提供了put和write方法,前者用于显示字符,后者用于显示字符串。write的第一个参数提供了要显示的字符串地址,第二个指出要显示多少个字符。需要注意的是write方法并不会在遇到空字符时停止打印字符,而是打印指定数目的字符,即使超出了字符串的边界。

4. 多数C++实现都会在输入即将发生时刷新缓冲区。如果实现并不能在希望时刷新输出,那么可以使用两个控制符中断一个强行刷新:控制符flush刷新缓冲区;控制符endl不仅刷新缓冲区还插入一个换行符。事实上,控制符也是函数,可以直接调用刷新,如flush(cout)。

5. cout 进行格式化,浮点数的老式实现和新实现有所不同,新实现当指数大于等于6或小于等于5时,用科学计数法表示,默认的行为对应于带%g说明符的标准C库函数fprintf。

6. cout如何设置显示整数时的计数系统:dec、hex和oct控制符,如hex(cout)

7. cout调整字符宽度:

int width();       // 返回字段宽度的当前设置
int width(int i);  // 将字段宽度设置为i个空格,并返回以前的字符宽度值

width方法只影响接下来显示的一个项目,然后字段宽度将恢复为默认值

8. cout填充字符:在默认情况下,cout使用空格填充字段中未被使用的部分,可以用fill( )函数来改变填充字符,与字段宽度不同的是,新的填充字符一直有效,直到更改它为止。

9. cout设置浮点数的显示精度:使用precision函数设置精度

10. cout打印末尾的0和小数点:ios_base类提供了一个setf函数可以控制多种格式化特性,这个类还定义了多个常量,可用作该函数的参数,例如使用ios_base::showpoint可以使cout显示末尾小数点,默认精度6位。

格式常量

常量 含义
ios_base::boolalpha 输入和输出bool值,值为true/false
ios_base::showbase 对于输出,使用C++基数前缀(0,0x)
ios_base::showpoint 显示末尾小数点默认精度为6
ios_base::uppercase 对于16进制输出,使用大写字母,E表示法
ios_base::showpos 在正数前面加上+,当且仅当基数为10时才使用,十六进制和八进制C++都视为无符号

setf有两个原型,第一个原型如下:

fmtflags setf(fmtflags);

其中fmtflags是bitmask类型的typedef名,用于存储格式标记。bitmask是一种存储各个位值的类型,他可以是整型、枚举,也可以是STL bitset容器,这里的主要思想是每一位都可以单独访问,都有自己的含义。

第二个原型如下:

fmtflags setf(fmtflags ,fmtflags);

第一个参数和第一个原型一样,第二个参数指出要清除第一个参数中的哪些位。

setf(long, long)的参数

第二个参数 第一个参数 含义
ios_base::basefield ios_base::dec 使用基数10
ios_base::basefield ios_base::oct 使用基数8
ios_base::basefield ios_base::hex 使用基数16
ios_base::floatfield ios_base::fixed 使用定点计数法,相当于printf中的%f说明符
ios_base::floatfield ios_base::scientific 使用科学计数法,相当于printf中的%e说明符
ios_base::adjustfield ios_base::left 使用左对齐
ios_base::adjustfield ios_base::right 使用右对齐
ios_base::adjustfield ios_base::internal 符号或基数前缀左对齐,值右对齐

11. setf( )的效果可以通过unsetf( )消除,没有专门只是浮点数默认模式的标记,使用参数ios_base::floatfield调用unsetf( )都将切换到默认模式。

12. C++在头文件iomanip中提供了其他一些控制符,常用的是setprecision、setfill、setw,它们分别用来设置精度、填充字符和设置字段宽度,setprecision接受一个指定精度的整数参数,setfill控制符接受一个指定填充字符的char参数,setw控制符接受一个指定字段宽度的整数参数。

13. 流状态由3个ios_base元素组成:eofbit、badbit、failbit

成员 描述
eofbit 如果到达文件尾,则设置为1
badbit 如果流被破坏,则设置为1
failbit 如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1
goodbit 另一种表示0的方法
good( ) 如果流可以使用,则返回true
eof( ) 如果eofbit被设置,则返回true
bad( ) 如果badbit或failbit被设置,则返回true
rdstate( ) 返回流状态
exceptions( ) 返回一个位掩码,指出哪些标记导致异常被引发
exceptions(isostate ex) 设置哪些状态将导致clear( )引发异常,默认设置为goodbit,也就是没有引发异常,运算符OR使得能够指定多位。
clear(iostate s) 将流状态设置为s,其他的清除,s的默认值为0,如果(restate( )& exceptions( )) != 0,则引发异常base_ios::failure
setstate(iostate s) 这将设置与s中设置的位对应的流状态位,其他状态为保持不变

设置流状态位有一个非常重要的后果:流将对后面的输入或输出关闭,直到位被清除。如果希望程序在流状态位被设置后能够继续读取后面的输入,就必须将流状态重置为良好,这可以通过调用clear( )方法实现。但这还不足以重新设置流的状态,导致输入循环终止的不匹配输入仍留在队列中,程序必须跳过它。一种方法是,一直读取字符知道到达空白为止。isspace函数一个cctype函数,当参数是空白字符时返回true;另一个方法是,丢弃行中的剩余部分。

14. 单字符输入get(char&)和get(void):提供不跳过空白的单字符输入功能

(1)成员函数get(char& ):如果函数到达文件尾(无论是真正的还是键盘仿真的),它都不会给其参数赋值。只要存在有效输入,函数的返回一个指向用于调用它的istream得引用,这意味着可以拼接get(char&)后面的其它抽取,此时判定的结果是true,循环将继续;到达文件尾时,返回值判定为false,循环终止。

(2)成员函数get(void):返回一个int值(或者其他整型,取决于字符集和区域),这意味着他不能够抽取运算符。到达文件尾后(无论真实与否),函数都将返回EOF——头文件iostream提供的一个符号常量,这也是返回值类型是int的原因之一,因为值EOF可能不能用char类型表示

15. 字符串输入getline( )、get( )、ignore( ):

istream& get(char* ,int, char);
istream& get(char* ,int);
istream& getline(char* ,int, char);
istream& getline(char* ,int);

(1)第一个参数是用于放置输入字符串的内存单元地址,第二个参数必要读取的最大字符数大1,第三个参数指定用作分界符的字符,只有两个参数的版本将换行符用作分界符。get( )和getline( )之间的区别在于,get( )将换行符留在输入流中,而getline抽取并丢弃输入流中的换行符。igone( )函数丢弃符合条件的字符串,它接受两个参数,第一个是要读取的最大字符数,第二个是分界符,原型为为两个参数提供的默认值为1和EOF,返回类型为istream &。

(2) getline方法如果遇到文件尾则设置eofbit,如果要读取的字符是换行符则读取并丢弃,如果读取结束,但下一个字符不是换行符,则设置failbit;get(char*, int) 首先测试字符数,然后测试是否为文件尾以及下一个字符是不是换行符。如果它读取了最大数目的字符,则不设置failbit标记。可以用peek来查看下一个输入字符,如果它是换行符,这说明get已经读取了整行,否则没读完,这个方法对getline不适用,因为它读取并丢弃换行符。

16. 其他istream方法:

(1)read( )与getline( )和get( )不同,不会在输入后加上空值字符,因此不能将输入转化为字符串,它常与ostream write( )函数结合使用,来完成文件输入输出。

(2)peek( )返回输入中的下一个字符,但不抽取输入流中的字符

(3)gcount( )返回最后一个非格式化抽取方法读取的字符数,这意味着字符是由get( )、getline( )、ignore( )或read( )方法读取的,不是抽取运算符>>读取的。

(4)pushback( )将一个字符插入到输入字符串中,被插入的字符是下一条输入语句读取的第一个字符,返回类型是istream&。

17. 较新的C++实现提供了一种更好检查文件是否被打开的方法——is_open( )方法,该方法能够检测到程序正试图以不合适的文件模式打开文件导致失败以及老式方法fin.good( ) 能检测到的错误。

18. C++有一种能让在命令行环境中运行的程序能够访问命令行参数的机制,方法是使用下面的main函数:

int main(int argc, char* argv[])

argc是命令行中参数的个数,包含命令名本身;argv是一个指针,指向命令行中的字符串参数

19. 有些C++实现要求在程序末尾使用fin.clear( ),有些则不要求,这取决于将文件与ifstream对象关联起来时,是否自动充值流状态。使用fin.clear( )是无害的,即使在不必使用它的时候使用。

20. C++文件模式常量:

常量 含义
ios_base::in 打开文件,以便读取
ios_base::out 打开文件,以便写入
ios_base::ate 打开文件,并移到文件尾
ios_base::app 追加到文件尾
ios_base::trune 如果文件存在,则截短文件
ios_base::binary 二进制文件

21. ifstream.open( )方法和构造函数用ios_base::in(打开文件以读取)作为模式参数的默认值,而ofstream.open( )和构造函数用ios_base::out | ios_base::trunc作为默认值。

22. C++和C的文件打开模式

C++模式 C模式 含义
ios_base::in "r" 打开以读取
ios_base::out 或者 ios_base::out | ios_base::trunc "w" 等价于ios_base::out | ios_base::trunc
ios_base::out | ios_base::app "a" 打开以写入,只追加
ios_base::in  | ios_base::out "r+" 打开以读写,在文件允许的位置写入
ios_base::in | ios_base::out | ios_base::trunc "w+" 打开以读写,如果已存在则首先截短文件
c++mode | ios_base::binary "cmodeb" 以C++mode(或相应的cmode)和二进制模式打开
c++mode | ios_base::ate "cmode" 以指定的模式打开,并移到文件尾。C使用一个独立的函数调用而不是模式编码。

23. fstream提供了两个在文件中移动的方式:seekg( ) 和 seekp( ),前者将输入指针移到指定的文件位置,后者将输出指针移动到指定的文件位置,实际上,由于fstream使用缓冲区来存储中间数据,因此指针指向的是缓冲区中的位置,而不是实际的文件。可以使用seekg来移到文件的开头。下面是seekg的两个原型:

basic_istream<charT, traits>& seekg(off_type, ios_base:seekdir);
basic_istream<charT, traits>& seekg(pos_type);

第一个原型:第一个参数是相对于文件特定位置的偏移量(单位为字节),第二个为文件位置特定值,它有三个可能的值:ios_base::beg(文件开始处),ios_base::cur(当前位置),ios_base::end(文件尾)。

第二个原型:参数是定位到文件中的一个位置,是文件中从文件开始处算起的绝对位置。它可以是类,但必须包含一个接受pos_type参数的构造函数和一个接受整数参数的构造函数,以便将这两种值转换为pos_type值。

24. 如果要检查文件指针的当前位置,对于输入流可以使用tellg方法,对于输出流可以使用tellp方法。

25. 创建fstream对象时,输入输出指针将一前一后地移动,因为tellg和tellp返回的值相同。然而如果使用istream对象管理输入流,使用ostream管理同一个文件的输出流,则输入输出指针框彼此独立的移动,因此tellg和tellp将返回不同的值。

26. 可以使用cstdio中声明的tmpnam生成TMP_NAM个不同的文件名,其中每个文件名包含的字符不超过L_tmpnam个。

27. iostream族支持程序和终端之间的I/O,而fstream使用相同的接口提供程序和文件之间的I/O,sstream使用相同的接口提供程序和string对象之间的I/O。

© 著作权归作者所有

吃一堑消化不良
粉丝 28
博文 188
码字总数 113563
作品 0
浦东
程序员
私信 提问
Linux中常用C/C++一些头文件的作用

1、 Linux中一些头文件的作用: <assert.h>:ANSI C。提供断言,assert(表达式) <glib.h>:GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包含<glib.h...

SibylY
2013/09/25
221
0
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事...

weixin_40647819
2018/05/23
0
0
11月推荐给程序员们的四本书

难得在家休息一段时间,职业病的原因吧,推荐技术书的习惯一时间没能改变。借着自己的微信平台,每天向大家推荐一些靠谱的内容,希望大家能喜欢。 先跟着我来看我今天推荐的第一本书吧! C+...

生气的散人
2013/11/11
987
2
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201812.html 文章 鸡啄米:C++编程入门系列之前言 鸡啄米:C++编程入门系列之一(进制...

开元中国2015
2015/06/27
85
0
[Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/89341077 该系列文章是讲解Python OpenCV图像处理知识,前...

Eastmount
04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

html2canvas 生成的图片变模糊解决方案

需求: 背景图片和二维码还有用户微信头像生成一张图片,可供用户下载。打开页面的时候就是一张图可以保存,html2canvas插件即可实现效果,效果是实现了,但是很郁闷,图片模糊了。。。。 为...

前端老手
15分钟前
3
0
语音翻译器在线翻译语音

对于英语不好的朋友来说,如果出国旅游,多多少少都会使用到翻译软件。通过在线翻译的方式,方便彼此的沟通交流。那么,有朋友就在问哪个英语翻译软件最准确?下面就来和大家一起分享下这个简...

401恶户
16分钟前
3
0
国内25家滤波器公司排名

国内做滤波器的企业都有哪些?哪些企业做滤波器是比较知名的?国内滤波器企业排名如何?以下是解优人才网小编给大家的分享,国内前25家做滤波器的企业详细信息。 1、武汉凡谷电子技术股份有限...

猎头悬赏平台
20分钟前
4
0
即时配送,不再只是巨头的战场

9月4日,第十届中国电子商务物流大会暨2019中国同城即时物流行业峰会于杭州召开。会上出现了蜂鸟即配、达达-京东到家、美团配送、点我达、闪送等一众即时配送行业中的知名企业的身影。 在艾媒...

喵二狸
21分钟前
3
0
Moto G 2014 LTE Root

[TOC] 下载moto专用mfastboot mfastboot-v2.zip 下载对应设备的twrp 我的是这个版本 Moto G 2014 LTE thea 刷入twrp # 1. 开启USE调试# 2. 允许OEM解锁# 3. 查看设备adb devices# 4. 进f...

yeahlife
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部