std::basic_istream<CharT,Traits>:: get
From cppreference.net
<
cpp
|
io
|
basic istream
|
int_type get
(
)
;
|
(1) | |
|
basic_istream
&
get
(
char_type
&
ch
)
;
|
(2) | |
|
basic_istream
&
get
(
char_type
*
s,
std::
streamsize
count
)
;
|
(3) | |
|
basic_istream
&
get
(
char_type
*
s,
std::
streamsize
count, char_type delim
)
;
|
(4) | |
|
basic_istream
&
get
(
basic_streambuf
&
strbuf
)
;
|
(5) | |
|
basic_istream
&
get
(
basic_streambuf
&
strbuf, char_type delim
)
;
|
(6) | |
标签内的C++代码均未翻译,仅对页面上的纯文本进行了翻译。表格中的数字编号(1)-(6)作为标识符予以保留)
从流中提取一个或多个字符。
所有版本的行为都如同 UnformattedInputFunction s 。在构造并检查哨兵对象后,这些函数执行以下操作:
2)
若存在可用字符,则读取一个字符并存储到
ch
中。否则,保持
ch
不变,并设置
failbit
和
eofbit
。请注意,与格式化字符输入运算符>>不同,此函数未针对
signed
char
和
unsigned
char
类型进行重载。
3)
与
get
(
s, count, widen
(
'
\n
'
)
)
相同,即最多读取
std::
max
(
0
, count
-
1
)
个字符,并将其存储到由
s
指向的字符串中,直到遇到
'
\n
'
。
4)
读取字符并将其存储到由
s
指向首元素的字符数组的连续位置中。字符将持续提取并存储,直到发生以下任一情况:
- count 小于 1 或已存储 count - 1 个字符。
- 输入序列中出现文件结束条件(将调用 setstate ( eofbit ) )。
-
下一个可用输入字符
c
等于
delim
(由
Traits
::
eq
(
c, delim
)
判定)。该字符不会被提取(与
getline()不同)。
在任何情况下,若
count
>
0
,则会在数组的下一连续位置存储一个空字符(
CharT
(
)
)。
6)
读取字符并将其插入到由给定
basic_streambuf
对象控制的输出序列中。字符将持续被提取并插入到
strbuf
中,直到发生以下任一情况:
- 输入序列中出现文件结束条件
- 向输出序列插入失败(此时未能插入的字符不会被提取)
- 下一个可用输入字符 c 等于 delim (通过 Traits :: eq ( c, delim ) 判定)。该字符不会被提取
- 发生异常(此时异常会被捕获且不会重新抛出)
如果未提取任何字符,则调用 setstate ( failbit ) 。
所有版本都将 gcount() 的值设置为提取的字符数量。
目录 |
参数
| ch | - | 用于写入结果的字符引用 |
| s | - | 指向存储字符的字符串的指针 |
| count | - | s 所指向字符串的大小 |
| delim | - | 停止提取的分隔字符。该字符不会被提取和存储 |
| strbuf | - | 用于读取内容的流缓冲区 |
返回值
1)
提取的字符或
Traits
::
eof
(
)
。
2-6)
*
this
异常
如果内部操作抛出异常,该异常会被捕获并设置
badbit
。如果为
badbit
设置了
exceptions()
,则异常会被重新抛出。
示例
运行此代码
#include <iostream> #include <sstream> int main() { std::istringstream s1("Hello, world."); char c1 = s1.get(); // 读取 'H' std::cout << "after reading " << c1 << ", gcount() == " << s1.gcount() << '\n'; char c2; s1.get(c2); // 读取 'e' char str[5]; s1.get(str, 5); // 读取 "llo," std::cout << "after reading " << str << ", gcount() == " << s1.gcount() << '\n'; std::cout << c1 << c2 << str; s1.get(*std::cout.rdbuf()); // 读取剩余部分,不包括 '\n' std::cout << "\nAfter the last get(), gcount() == " << s1.gcount() << '\n'; }
输出:
after reading H, gcount() == 1 after reading llo,, gcount() == 4 Hello, world. After the last get(), gcount() == 7
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 370 | C++98 |
重载
(5)
的效果是
get
(
s, count, widen
(
'
\n
'
)
)
,
这实际上是重载 (3) 的效果 |
修正为
get ( strbuf, widen ( ' \n ' ) ) |
| LWG 531 | C++98 |
重载
(3,4)
无法处理
count 为非正值的情况 |
在此情况下
不提取任何字符 |
参见
|
提取字符块
(公开成员函数) |
|
|
提取格式化数据
(公开成员函数) |
|
|
提取字符和字符数组
(函数模板) |