C++学习-Day-34
一、C++输入和输出
C++把输入和输出看作字节流,它充当了程序和目标之间的桥梁。这使得C++程序可以以相同的方式对待来自键盘和文件的输入和输出,程序只需要检查字节流而不需要知道字节来自何方。管理输入和输出宜按包含两个步骤:
- 将流和输入或输出的程序相关联
- 将流和文件相关联
通常使用缓冲区可以更高效地处理输入和输出。缓冲区是用作中介的内存块,它是信息从设备传输到程序或者从程序传输到设备的临时存储工具。比如想从磁盘读取某些数据时,直接一个字节一个字节读取,因为从磁盘读取一个字节需要耗费大量的硬件活动,而将这些数据啊先全部读取到缓冲区,再从缓冲内存读取则速度更快。
如果实现不能在所希望时刷新缓冲区,可以使用两个控制符中的一个来强行进行刷新。控制符flush刷新缓冲区,而控制符endl刷新缓冲区并插入一个换行符。
修改显示时候的计数系统。对于整数十进制、十六进制和八进制计数系统的设置,我们可以使用dec、hex、oct控制符。例如将计数系统设置为十六进制,我们可以这样做:hex(cout)或者cout<<hex;
调整字段宽度。width()返回字段当前宽度,width(int n)将当前字段设置为n个空格并返回之前的字段宽度。注意,其只能影响接下来显示的一个项目。
填充字符。默认情况下cout用空格填充,我们可以使用fill()成员函数来来说设置填充字符,其会一直有效直到我们更改。
设置浮点数的显示精度。浮点数精度取决于输出模式,在默认模式下它显示总位数,在定点和科学模式下精度指的是小数点后面的位数。C++默认精度为6位(末尾的0不显示),precision()成员函数使得可以设置精度。该函数设置后一直有效直到重新设置。
setf()方法控制了小数点被显示时其他几个格式选项。ios_base类有一个受保护的数据成员(这里叫作标记),其中的各位控制着格式化的各个方面,像DIP开关一样。setf()函数提供了另外一种调整标记的途径,setf()函数有两种原型:
- fmtflags setf(fmtflags);
其中fmtflags是bitmask类型的typedef名,用于存储格式标记。其中ios_base已经定义好了代表为的常量:
常量 | 含义 |
---|---|
ios_base::boolalpha | 输入和输出bool值,可以为true或false |
ios_base::showbase | 对于输出,使用C++基数前缀(0,0x) |
ios_base::showpoint | 显示末尾的小数点 |
ios_base::uppercase | 对于16进制输出,使用大写字母E表示法 |
ios_base::showpos | 在正数前面加+ |
- fmtflags setf(fmtflags,fmtflags);
第二个setf()原型接受两个参数,并返回以前的设置,第一个参数包含了设置值,第二个参数指出要清除第一个参数中的哪些位。
第二个参数 | 第一个参数 | 含义 |
---|---|---|
ios_base::basefield | ios_base::dec | 使用基数10 |
ios_base::oct | 使用基数8 | |
ios_base::hex | 使用基数16 | |
ios_base::floatfield | ios_base::fixed | 使用定点计数法 |
ios_base::scientific | 使用科学计数法 | |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
ios_base::right | 使用右对齐 | |
ios_base::internal | 基数或前缀左对齐,值右对齐 |
调用setf()的效果都可以使用unsetf()来消除。
特征 | cin.get(ch) | ch=cin.get() |
---|---|---|
传输输入字符的方法 | 赋给参数ch | 函数返回int类型给ch |
字符输入时返回值 | 指向istream对象的引用 | 字符编码(int值) |
达到文件尾时返回值 | 转换为false | EOF |
字符串输入:getline()、get()、ignore()它们的函数原型如下
istream &get(char *,int,char)
istream &get(char *,int)
istream &getline(char *,int,char)
istream &getline(char *,int)
第一个参数用于放置输入字符的内存地址,第二个参数要比读取字符串长度大1(最后一位用于放置结尾空字符),第三个参数指定用作分界符的字符。get()和getline()之间主要区别在于,get()将换行符留在输入流中,而getline()将换行符抽取并丢弃输入流中的换行符。
ignore()成员函数,该函数接受两个参数,一个是数字,指定读取的最大字符数,另一个是字符用作输入分界符。其原型为:
istream & ignore(int=1,int=EOF);
二、文件I/O
要让程序写入文件,必须这样做:
- 创建一个ofstream对象啦管理输出流;
- 将该对象与特定的文件关联起来;
- 以使用cout的方式使用该对象。
以默认方式打开文件进行输出时会自动将文件长度截短为零。
较新的C++提供了一种好的检查文件是否能被打开的方法is_open(),它能检查其他方式不能检查出的微妙问题,比如以一种错误模式打开文件。
文件模式。文件模式描述文件将被如何使用:读、写、追加等,将流与文件进行关联时都提供了第二个参数进行模式设置,ios_base类定义了一个openmode类型,它是一种bitmask类型,我们可以使用ios_base类中定义的多个常量来指定模式,下表中列出了这些常量。
常量 | 含义 |
---|---|
ios_base::in | 打开文件,以便读取 |
ios_base::out | 打开文件,以便写入 |
ios_base::ate | 打开文件,并移动到文件尾 |
ios_base::app | 追加到文件尾 |
ios_base::trunc | 如果文件存在,则截短文件 |
ios_base::binary | 二进制文件 |
随机存取。fstream类为此继承了连个方法:seekg()和seekp(),前者将输入指针移到指定的文件位置,后者将输出指针移到指定文件位置。seekg()第一个原型使用相对位置,seekg()的第一个参数被用来度量特定位置的偏移量,第二个参数指定位置类型,有三个可能值:ios_base::beg指相对文件开始处偏移量;ios_base::cur指相对于当前位置的偏移量;ios_base::end指相对于文件尾的偏移量。seekg()第二个原型使用绝对位置,直接写入位置值(整型)。
如果要检查文件指针当前位置,对于输入流可以使用tellg(),对于输出流可以使用tellp(),它们返回的都是相对文件开头的绝对位置,以字节为单位。