C++程序设计:原理与实践读书笔记(第十一章)

我们可以指定(十进制)数1234以十进制、十六进制(通常简称为“hex”)或八进制输出:

cout<<1234<<"\t(decimal)\n"
    <<hex<<1234<<"\t(hexadecimal)\n"
    <<oct<<1234<<"\t(octal)\n";

符号<<hex和<<oct并不输出任何内容,然而<<hex通知流应该以十六进制输出人和后来的整形值,而<<oct通知流以八进制输出后来的整数。(oct、hex和dec是持久不变的)例如:

cout<<1234<<'\t'<<hex<<1234<<'\t'<<oct<<1234<<'\n';
cout<<1234<<'\n';    //八进制的基数仍然起作用

可以通过使用showbase和noshowbase来切换是否为八进制、十六进制加前缀0、0x。这两个操纵符的效果是持久的。

对于输入来说,oct、dec和hex对于输入也是持久的。可以让>>接受前缀0和0x并正确解释。为了实现这一效果,需要“复位”所有默认设置,例如:

cin.unsetf(ios::dec);    //不再设定十进制显示(这样0x可以意味着十六进制)
cin.unsetf(ios::oct);    //不再设定八进制
cin.unsetf(ios::hex);    //不再设定十六进制

通过使用fixed、scientific和defaultfloat来选择浮点数格式。如:

cout << 1234.56789 << '\t'
     << fixed << 1234.56789 << '\t'
     << scientific << 1234.56789 << '\n';
cout << 1234.56789 << '\n';                    //浮点数格式是持久的
cout << defaultfloat << 1234.56789 << '\t'     //浮点值输出的默认格式
     << fixed << 1234.56789 << '\t'
     << scientific << 1234.56789 << '\n';  

浮点数格式化输出操纵符总结如下:

fixed使用定点表示
scientific使用尾数和指数表示方式        
defaultfloat在精度范围内,自动选择fixed和scientific中更为精确的一种

默认设置下,defaultfloat格式用6位数字来输出一个浮点值例如:1234.567输出为1234.57,1.2345678输出为1.23457。舍入规则采用四舍五入规则。程序员可以使用setprecision()来设置精度。

cout << defaultfloat << setprecision(5);

浮点数的精度定义为:

defaultfloat精度就是数字的个数
scientific精度就是小数点之后数字的个数
fixed精度为小数点之后数字的个数

可以使用操纵符setw()精确指定一个整数或一个字符串输出占用多少个位置。这对打印表格这类的应用很有用,称为域。

可以使用多种模式打开文件。默认情况下,用ifstream打开的文件用于读,用ofstream打卡的文件用于写,这满足了大多数一般需求。但是,你也可以选择其他方式:

文件流打开模式
ios_base::app追加模式(即添加在文件末尾)
ios_base::ate"末端‘’模式(打开文件并定位到文件尾)
ios_base::binary二进制模式
ios_base::in读模式
ios_base::out写模式
ios_base::trunk将文件截为长度0

可以在文件名之后指定文件模式,可以用“|”组合多个模式。例如:

ofstream of1{name1};    //默认设置为ios_base::out
ifstream if1{name2};    //默认设置为ios_base::in

ofstream ofs{name, ios_base::app};    //带ios_base::out模式的默认设置的输出流
fstream fs{"myfile", ios_base::in|ios_base::out};    //同时带in和out模式的流

在文件中定位:

fstream fs{name};    //打开文件进行输入输出
if(!fs)error("can't open", name);

fs.seekg(5);         //移动读位置(g表示“获取”)到5(第6个字符处)
char ch;
fs>>ch;              //进行读操作
cout<<"character[5] is "<<ch<<'('<<int(ch)<<")\n";

fs.seekp(1)          //移动写位置(p表示“放置”)到1
fs<<'y';             //进行写操作,并增加写位置

从一个字符串读取内容的istream对象称为istringstream,保存字符并将其写入字符串的ostream对象称为ostringstream。

double str_to_double(string s)
    //如果可能,将字符转换为浮点数
{
    istringstream is{s};        //定义一个流来从s中读出
    double d;
    is >> d;
    if(!is) error("double format error: ", s);
    return d;
}

double d1 = str_to_double("12.4");                  //测试
double d2 = str_to_double("1.34e-3");     
double d3 = str_to_double("twelve point three");    //会调用error()

标准库istream库也提供了读取单个字符和整行内容的功能。如果希望一次读取整行内容,可以使用函数getline():

string name;
getline(cin, name);        //输入:Dennis Ritchie
cout<<name<<'\n';          //输出:Dennis Ritchie

函数istream::get()读入单个字符,赋予它的参数。

下面是实现字符分类的标准函数库:

字符分类
isspace(c)

c是空白符吗

isalpha(c)       c是字母吗
isdigit(c)c是十进制数字吗
isxdigit(c)c是十六进制数字吗
isupper(c)c是大写字母吗
islower(c)c是小写字母吗
isalnum(c)c是字母或十进制数字吗
iscntrl(c)c是控制字符吗
ispunct(c)c是标点吗
isprint(c)c是可打印字符吗
isgraph(c)c是字母、十进制数字或者标点吗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值