1.1 输入与输出
1.1.1 iostream
<iostream>库是一个十分常见的库,输入输出时我们都会包含它,事实上,这个库包含了<ios>、<streambuf>、<istream>和<ostream>。
| 全局流对象 | 简介 |
|---|---|
cin |
标准输入流 |
cout |
标准输出流 |
cerr |
非缓冲标准错误流 |
clog |
缓冲标准错误流 |
cout、cerr和clog与流插入运算符<<结合使用,而cin与流提取运算符>>结合使用。
cerr是非缓冲的,每个流插入到cerr时都会立即输出,因此可以被用来进行错误信息输出。
cout和clog是缓冲的,插入会存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。
1.1.2 输入
| 成员函数 | 简介 |
|---|---|
get |
从输入流中读取一个或多个字符 |
getline |
从输入流中读取一行 |
ignore |
导致从当前读取位置跳过大量元素 |
peek |
返回要读取的下一字符 |
seekg |
重置在输入流中的位置 |
read |
从流中读取指定数目的字符,并将其存储到数组中 |
gcount |
返回在最后一个未格式化输入期间读取的字符数 |
get函数
istream& get ();
istream& get (char ch);
istream& get (char* s, streamsize n);
istream& get (char* s, streamsize n, char delim);
第一和第二种重载使用时没有任何区别,即cin.get(ch)和ch=cin.get()的区别,均为读取一个字符,也可以读取空格和回车,因此使用时务必注意,在输入a[回车]的时候,实则触发了两个cin.get()。
第三和第四种重载则可以读取包含结束标记符在内的,至多n个字符,并在末尾添加空字符\0。即读取至多n-1个字符,保存在数组s中。当输入了delim时,即使还没读够n-1个字符,遇到delim时读取终止,且delim不会被存进数组s中。
getline函数
istream& getline (char* s, streamsize n);
istream& getline (char* s, streamsize n, char delim);
可以读取至多n-1个字符,保存在数组s中。当输入了delim时,即使还没读够n-1个字符,遇到delim时读取终止,且delim不会被存进数组s中。
ignore函数
istream& ignore (streamsize n, char delim);
可以跳过至多n-1个字符,读取接下来的字符。当输入了delim时,即使还没跳过n-1个字符,遇到delim时跳过终止。
对于输入了一行结束,需要消耗一个回车的情况下,ignore(1, '\n')和get()可以起到相似的作用。
peek函数
int peek();
peek函数返回输入流中的下一个字符,但不从流中提取它,即不会消耗该字符。
如果到达末尾,会返回EOF。
seekg函数
istream& seekg (streampos pos);
istream& seekg (streamoff off, ios_base::seekdir way);
seekg函数用于设置输入流中的位置指针,控制从哪里开始读取。第一种重载将位置指针设置为绝对位置pos,第二种重载将位置指针设置为相对于way的偏移量off。
way是ios_base::seekdir枚举,包括:
ios_base::beg:从流开始处计算ios_base::cur:从当前位置计算ios_base::end:从流末尾计算
read函数
istream& read (char* s, streamsize n);
可以读取至多n个字符,不会在末尾自动添加空字符\0,保存在数组s中。
read是一个不安全的函数。
gcount函数
streamsize gcount() const;
gcount特意放在最后说明,这是一个计数函数,返回最后一个未格式化输入操作读取的字符数。
未格式化的输入操作例如get()、getline()、read()。
1.1.3 输出
| 成员函数 | 说明 |
|---|---|
flush |
刷新缓冲区 |
put |
将字符放入流中 |
seekp |
重置在输出流中的位置 |
write |
将字符放入流中 |
flush函数
ostream& flush();
flush函数刷新输出缓冲区,强制将缓冲区中的所有数据写入到目标设备中。
特别的,flush同时是一个流操纵符,除了用cout.flush()调用函数,cout<<flush的效果也是相同的。
与cout<<endl相比,两者都会刷新缓冲区,但cout<<endl还会输出换行。
put函数
ostream& put (char c);
put函数将单个字符c放入输出流中。
也因此,很常用这样的代码:
cout.put('H').put('e').put('l').put('l').put('o').put('\n');
seekp函数
ostream& seekp (streampos pos);
ostream& seekp (streamoff off, ios_base::seekdir way);
seekp函数用于设置输出流中的位置指针,控制从哪里开始写入。第一种重载将位置指针设置为绝对位置pos,第二种重载将位置指针设置为相对于way的偏移量off。
write函数
ostream& write (const char* s, streamsize n);
write函数将s指向的数组中的前n个字符写入输出流中,不会在末尾自动添加空字符\0。
1.1.4 格式化输出
#include <iomanip>
| 操纵符 | 简介 |
|---|---|
| 字段宽度与填充格式 | |
setw(n) |
设置字段宽度为n |
setfill(c) |
设置填充字符为c |
| 小数控制格式 | |
setprecision(n) |
设置浮点数精度为n |
fixed |
使用固定小数点表示法 |
scientific |
使用科学计数法表示 |
showpoint |
总是显示小数点 |
noshowpoint |
不总是显示小数点 |
| 对齐格式 | |
left |
左对齐输出 |
right |
右对齐输出(默认) |
internal |
在符号和数值之间填充 |
| 整数进制格式 | |
hex |
十六进制输出 |
dec |
十进制输出(默认) |
oct |
八进制输出 |
showbase |
显示进制前缀0x/0 |
noshowbase |
不显示进制前缀 |
uppercase |
十六进制输出使用大写字母 |
nouppercase |
十六进制输出使用小写字母 |
| 符号显示格式 | |
showpos |
对正数显示+号 |
noshowpos |
对正数不显示+号 |
| 布尔值格式 | |
boolalpha |
布尔值输出为true/false |
noboolalpha |
布尔值输出为1/0 |
1.1.5 字符串流
#include <sstream>
一. 主要类
字符串流将字符串作为流来处理,可以使用 >> 和 << 操作符来读写字符串数据。
| 类 | 简介 |
|---|---|
istringstream |
输入字符串流,从字符串读取数据 |
ostringstream |
输出字符串流,向字符串写入数据 |
stringstream |
输入输出字符串流,兼具两者功能 |
使用字符串流类似于使用基本数据类型:
istringstream iss("Hello 123");
ostringstream oss;
stringstream ss;
二. 常用成员函数
| 成员函数 | 简介 |
|---|---|
str() |
获取或设置底层字符串 |
clear() |
清除错误状态标志 |
seekg() |
设置输入位置指针 |
seekp() |
设置输出位置指针 |
str函数
string str() const; // 获取底层字符串
void str (const string& s); // 设置底层字符串
str 函数用于获取或设置字符串流中的字符串内容。
获取字符串:
ostringstream oss;
oss << "数值: " << 42;
string result = oss.str();
设置字符串:
istringstream iss;
iss.str("100 200");
clear函数
void clear (iostate state = goodbit);
clear 函数用于清除错误状态标志,当字符串流到达末尾或发生错误时使用。
seekg函数
istream& seekg (streampos pos);
istream& seekg (streamoff off, ios_base::seekdir way);
seekg函数用于设置输入流中的位置指针,控制从哪里开始读取。
seekp函数
ostream& seekp (streampos pos);
ostream& seekp (streamoff off, ios_base::seekdir way);
seekp函数用于设置输出流中的位置指针,控制从哪里开始写入。
腾讯成长空间 5958人发布