cin>>
- 常用函数原型
istream& operator>> (type& val);
- 从cin绑定的istream中,提取字符到val中,遇到’ ‘、’\t’、‘\n’,会提取并丢弃,并停止提取
- 会返回cin自身的引用,即绑定到cin的istream
- 对于while(cin>>val)这样的用法,实际上是因为重载了
explicit operator bool() const;
,会返回failbit||badbit - 对于下列三种情况,会触发error,使(cin)为false
- eofbit: 输入序列没有更多可用字符(到达文件末尾)。
- failbit: 要么没有提取字符,要么提取的字符无法解释为适当类型的有效值。
- badbit: 流上的错误(例如当此函数捕获由内部操作引发的异常时)。
- 注意,换行符\n,不会使(cin)为false
cin.get()
- 常用函数原型
int get(); istream& get (char& c); istream& get (char* s, streamsize n); istream& get (char* s, streamsize n, char delim);
- 显然,只能将istream提取到char或者c-string中
- 工作原理
- 从流中提取字符并以 c 字符串的形式存储在 s 中,直到提取(n-1)字符或遇到分隔字符: 分隔字符是换行字符(’\n’)或分隔符(如果指定了此参数)。
- 如果找到了分隔符,分隔字符不会从输入序列中提取出来,而是作为下一个要从流中提取的字符保留在那里。
- 如果 n 大于零,即使提取了空字符串,也会自动将空字符(’\0’)附加到所写序列。
- 触发error的条件,与cin>>相同,因此也存在while(cin.get(val, size))的用法
- 通常会使用getline替换get
cin.getline()
- 常用函数原型
istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim );
- 只能将istream提取到c-string中,因此必须指定长度
- 工作原理
- 从流中提取字符作为未格式化的输入,并将它们以 c 字符串的形式存储到 s 中,直到提取的字符为分隔字符,或者 n 个字符被写入到 s 中(包括终止的 null 字符)。
- 第一个形式的分隔符是换行符(’n’) ,第二个形式的分隔符是delim: 当在输入序列中找到它时,它从输入序列中提取出来,但是丢弃,不写入 s。
- 如果到达流末尾,该函数将停止提取字符。如果过早地达到末尾(在写入 n 个字符或找到 delim 之前) ,该函数将设置 eofbit 标志。
- 如果函数没有提取任何字符,或者一旦(n-1)字符被写入,分隔字符没有找到,则设置failbit。注意,如果输入序列中跟在这些(n-1)字符后面的字符恰好是分隔字符,则该字符也被提取并丢弃,而failbit不被设置(提取的序列正好是 n 个字符长)。
- 如果 n 大于零,即使提取了空字符串,也会自动将空字符(’\0’)附加到所写序列。
- 这个函数在 < string > 中为string对象重载,从而可以将istream提取到string中。
getline()
- 常用函数原型
istream& getline (istream& is, string& str); istream& getline (istream& is, string& str, char delim);
- 可以指定istream,提取到string中
- 工作原理
- 从 is 中提取字符并将它们存储到 str 中,直到找到分隔符(或换行符‘\n’)。
- 如果到达文件末尾,或者在输入操作期间出现其他错误,则提取也将停止。
- 如果找到了分隔符,它将被提取并丢弃(也就是说,它没有被存储,下一个输入操作将在它之后开始)。
- 请注意, str 中的任何内容都将被新提取的序列替换。
- 每个提取的字符都被附加到string中,就好像它的成员 push _ back 被调用一样。
- istream可以为iostream、ifstream、istringstream
cin.ignore()
- 常用函数原型
istream& ignore (streamsize n = 1, int delim = EOF);
- 提取并丢弃字符
- 工作原理
- 从输入序列中提取字符并丢弃它们,直到提取了 n 个字符,或者遇到分隔符,则丢弃并停止。
- 如果到达文件末尾,该函数还将停止提取字符。如果过早地达到这个值(在提取 n 个字符或找到 delim 之前) ,函数将设置 eofbit 标志。
其他
cin.clear()
void clear (iostate state = goodbit);
标志的当前值被覆盖: 所有位被状态中的位替换; 如果状态为 good 位(即0) ,则清除所有错误标志。
cin.peek()
int peek();
返回输入序列中的下一个字符,但不提取该字符: 该字符作为要从流中提取的下一个字符保留。
调用此函数将 gcount 返回的值设置为零。
cin.gcount()
streamsize gcount() const;
返回对象上次执行的无格式化输入操作提取的字符数。
修改此函数返回值的未格式化输入操作是: get、 getline、ignore、peek、 read、 readsome、 putback 和 unget。
注意,peek、 putback 和 unget 实际上并不提取任何字符,因此 gcount 在调用其中任何一个后总是返回零。