我们可以指定(十进制)数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是字母、十进制数字或者标点吗 |