cin>>、cin.get()、cin.getline()、getline()、cin.ignore()

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 在调用其中任何一个后总是返回零。

猜你喜欢

转载自blog.csdn.net/m0_46324847/article/details/126824457
今日推荐