第17章——输入、输出和文件

 

标准类库是一个非正式的标准,只是由头文件iostream和fstream中定义的类组成。

l         流和缓冲区

C++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。

管理流和缓冲区的工作有点复杂,不过iostream文件中包含了一些专门设计用来实现、管理流和缓冲区的类。

一些类:

n         streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法

n         ios_base类表示流的一般特征,如是否可读取、是二进制流还是文本流等。

n         ios类基于ios_base,其中包括了一个指向streambuf对象的指针成员。

n         ostream类是从ios类派生而来的,提供了输出方法。

n         istream类也是从ios类派生而来的,提供了输入方法。

n         iostream类是基于istream和ostream类的,因此继承了输入方法和输出方法。

 

C++的iostream类库管理了很多细节。例如,在程序中包含iostream文件将自动创建8个流对象

n         cin对应于标准输入流,默认情况关联到标准输入设备(键盘)。wcin对象与此类似,但处理的是wchar_t类型。

n         cout对象与标准输出流相对应,默认情况关联到标准输出设备(显示器)。wcout对象与此类似,但处理的是wchar_t类型。

n         cerr对象与标准错误流相对应。在默认情况下,关联到标准输出设备(显示器)。wclog与此类似

n         clog对象也对应着标准流,但是这个流被缓冲。

使用cout进行输出

插入操作符被重载,使之能够识别C++中所有的基类类型。此外ostream类还为下面的指针类型定义了插入操作符函数:

n         const signed char*;

n         const unsigned char*;

n         const char*;

n         void *;

刷新缓冲区

cout<<flush;

cout<<endl;

对cout进行格式化

默认情况下:

n         对于char值,如果它代表的是可打印字符,则将被作为一个字符显示在宽度为一个字符的字段中。

n         对于数值整形,将以十进制方式显示在一个刚好容纳该数字及负号的字段中。

n         字符串被显示在宽度等于该字符串长度的字段中。

n         浮点类型被显示为6位,末尾的0不显示。当指数>=6或<=-5时,将使用科学计数法表示。

 

修改计数系统

十六进制:hex(cout);等价于cout<<hex;

十进制:cout<<decimal;

八进制:cout<<octal;

调整字段宽度:

int width();//当前设置

int width(int i);//字段宽度设置为i个字符,包括小数点

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

C++永远不会截短数据。

 

填充字符

eg:cout.fill(‘*’);

此方法一直有效,直到更改它为止。

 

设置浮点数的显示精度

浮点数数度的含义取决于输出模式。在默认情况下,它指的是显示的总位数。在定点模式和科学模式下,精度指的是小数点后面的倍数。

cout.precision(2);

 

打印末尾的0和小数点

cout.setf(ios_base::showpoint);

显示末尾小数点

 

关于setf()

setf()函数的第一个原型

fmtflags setf(fmtflags);

第二个原型

fmtflags setf(fmtflags,fmtflags);

第一个参数指出要设置的位,第二个参数指出要清楚哪些位。

eg:

ios_base::fmtflags old = cout.setf(ios::left,ios::adjustfield);

格式常量

常量

意义

ios_base::boolalpha

输入输出bool值

ios_base::showbase

对于输出,使用C++基数前缀(0,0x)

ios_base::showpoint

显示末尾的小数点

ios_base::uppercase

对于16进制,使用大写字母,E表示法

ios_base::showpos

在正数前面加上+

setf(long,long)的参数

第二个参数

第一个参数

含义

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() 不是进行格式化的,对用户最为友好的方法,C++提供了多个控制符,能够调用setf(),并自动提供正确的参数。

eg:

cout<<left<<fixed;

以上两个表格中的项如internal,scientific,showbase等都可用作标准控制符。

 

C++在iomanip头文件中提供了其他一些控制符,3个最常用的控制符setprecision(),setfill()和setw()

l         使用cin进行输入

istream类还为下列字符指针类型重载了>>抽取操作符

signed char *;char *;unsigned char *;

cin>>如何检查输入

跳过空白(空格、换行符和制表符),直到遇到非空白字符。它读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。

 

cin或cout对象包含一个描述流状态的数据成员(stream state)。流状态由3个ios_base元素组成:eofbit/badbit/failbit。当cin操作到达文件末尾时,它将设置eofbit;当cin操作未能读取预期的字符时,它将设置failbit.在一些无法诊断的失败破坏流时,badbit被设置。

设置状态

clear(),全部清0

clear(eofbit);eofbit将被设置,另外两个状态位被清除。

setstate(eofbit);只设置eofbit其它位不变

使用exceptions()方法来控制异常如何被处理。

eg:

cin.exceptions(badbit|eofbit);

如果badbit和eofbit随后被设置,将引发异常。

设置流状态位有一个非常重要的后果:流将对后面的输入或输出关闭,直到位被清楚。

isspace()是一个cctype函数,它在参数是空白字符时返回true.fail()在failbit或eofbit()被设置时返回true.

其它istream类方法

get(char&)和get(void)方法提供不跳过空白的单字符输入功能。

get(char *,int,char)和getline(char*,int,char)函数在默认情况下读取整行,而不是一个单词。

单字符输入

eg:

int ct=0;

char ch;

cin.get(ch);

while(ch!=’/n’)

{

       cout<<ch;

       ct++;

       cin.get(ch);

}

cout<<ct<<endl;

 

如果程序使用>>

则输入时的空格在显示时就会被删除。

也可以这样:ch=cin.get();

如果希望跳过空白,则使用>>,如果不路过,get(char &)效果更佳。

 

字符串输入

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

istream &get(char *,int);

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

istream &getline(char *,int);

 

cin.ignore(255,’\n’);

读取并丢弃接下来的255个字符或直到到达第一个换行符。

get(char *,int)和getline()会影响流状态。当不能抽取字符时,这两个方法瘵设置failbit位。不能抽取字符的情况有两种,一是输入方法立刻到达了文件尾,二是输入了一个空行。当读了最大数目的字符,且行中还有其他字符时,getline()也会设置failbit

其它istream方法

 

peek()函数返回输入中的下一个字符,但不抽取输入字符。gcount()返回最后一个非格式化抽取方法读取的字符数。putback()函数将一个字符插入到输入字符串中,被插入的字符是下一条输入语句读取的第一个字符。

l         C++在头文件fstream中定义了多个新类,其中包括用于文件输入的ifstream类和用于文件输出的ofstream类。

方法c_str()来给ofstream和ifstream的构造函数提供一个C-风格字符串参数。

文件模式

常量

含义

常量

含义

ios_base::in

打开文件,以便读取

ios_base::app

追加到文件尾

ios_base::out

打开文件,以便写入

ios_base::trun

如果文件存在,截短

ios_base::ate

打开文件,并移到文件尾

ios_base::binary

二进制文件

文本文件指的是将所有内容都存储为文本。对于字符来说,二进制文件与文本表示是一样的,即字符的ASCII码的二进制表示。对于数字来说,二进制文件与文本表示有很大的差别。存取二进制文件采用write()和read()方法。

 

fstream继承了两个重要方法:

seekg().前者将输入指针移到指定的文件位置

seekp()后者将输出指针移到指定的位置。

seekg()两个原型

istream & seekg(streamoff,ios_base::seekdir);

istream &seekg(streampos);

seekdir的三个值:

ios_base::beg

ios_base::cur

ios_base::end

 

使用临时文件

char *tmpname(char *pszName)

eg:

char pszName[L_tmpnam]={‘\0’};

for(…){…tmpnam(pszName);}

 

l         iostream族支持程序与终端IO

fstream族支持程序与与文件之间的IO

sstream族支持string对象之间的IO

读取string对象中的格式化信息或将格式化信息写string对象中被称为内核格式化。

 

全部完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值