1)cin是istream类的一个对象
2)cin对象将标准输入表示为字节流,通常情况下,通过键盘来生成这种字符流
3)istream重载了抽取运算符>>,用于从输入流中抽取字符
通常可以这样使用:cin >> value_holder;
其中value_holder为存储输入的内存单元,它可以是变量,引用,解除引用的指针,也可以是类或结构的成员。
4)格式化输入函数:可以将输入数据转换为目标指定的格式
5)抽取运算符 >>属于格式化输入函数
经典的运算符函数原型 :istream& operator >> (int &);
即传入参数为某类型(int / double / char / char* 等)的引用,返回值为istream类型的引用
由于返回值为调用对象的引用,则可以直接修改参数的变量的值,并且,这使得能够将输入拼接起来,如:cin >> a >> b >> c;
抽取运算符>>跳过空白(空格、换行符、制表符)!!! ,直到遇到非空白字符。
(1)成员函数get(char&)
传入参数为char类型的引用,返回值类型为调用它的istream对象,这意味着 可以拼接 get(char&)后面的其它抽取,如:
char c1, c2, c3;
cin.get(c1).get(c2) >> c3;
如果cin.get(char&)到达文件尾----无论是真正的文件尾,还是通过键盘仿真的文件尾(对于Windows命令提示符模式和DOS,为按下Ctrl + Z;对于UNIX,是在首行按下Ctrl + D),它都不会给参数赋值。另外,该方法还调用setstate(failbit),导致cin的测试结果为false:
char ch;
while (cin.get(ch)) {
//程序
}
只要存在有效输入,cin.get(ch)的返回值都将是cin,此时的判定结果为true,因此循环将继续。到达文件尾时,返回值判定为false,循环终止。
(2)成员函数get()
没有传入参数,返回值类型为int(或某种更大的整型,这取决于字符集和区域),因此不可以拼接!
char ch;
ch = cin.get();
到达文件后(不管是真的文件尾还是模拟的文件尾),cin.get()都将返回值EOF—头文件iostream提供的一个符号常量。这种设计特性使得可以这样来读取输入:
int ch; //注意:这里ch的类型为int,而不是char,因为值EOF可能无法使用char类型来表示。
while ((ch = cin.get()) != EOF) {
//程序
}
在使用char参数 get(char) 或没有参数 get() 的情况下,get()方法读取下一个输入字符,即使该字符是空格、制表符或换行符。即:不会跳过空白字符(空格、换行符、制表符)!!!
特征 | cin.get(ch) | ch = cin.get() |
---|---|---|
传输输入字符的方法 | 赋给参数 ch | 将函数返回值赋给 ch |
字符输入时函数的返回值 | 指向 istream 对象的引用 | 字符编码(int值) |
到达文件尾时函数的返回值 | 转换为false | EOF |
首先,应确定是否希望跳过空白,如果跳过空白方便,则使用抽取运算符>>
如果希望程序检查每个字符,应使用get()方法,例如,计算字数的程序可以使用空格来判断单词何时结束。在get()方法中,get(char&)的接口更佳。没有参数的get()主要优点是,它与标准C语言中getchar()函数极其类似,这意味着可以通过包含iostream()(而不是stdio.h),并使用cin.get()替换所有的getchar(),用cout.put(ch)替换所有的putchar(char),来将C程序转换为C++程序
istream& get(char*, int);
istream& get(char*, int, char);
istream& getline(char*, int);
istream& getline(char*, int, char);
第一个参数,用于放置输入字符串的内存单元的地址
第二个参数,比读取的最大字符数大1(额外的一个字符用于存储结尾的空字符,以便将输入存为一个字符串)
第三个参数,指定用于作为分界符的字符,只有两个参数的版本将换行符用作分界符。
上述4个函数都在读取最大数目的字符或遇到换行符后为止。
get()将分界符留在输入流中,这样接下来的输入操作首先看到的将是分界符,而getline()抽取并丢弃输入流中的分界符
可以参考一下代码体会一下!
#include
const int Limit = 255;
int main()
{
using std::cout;
using std::cin;
using std::endl;
char input[Limit];
cout << "Enter a string for getline() processing:\n";
cin.getline(input, Limit, '#');
cout << "Here is your input:\n";
cout << input << "\nDone with phase 1\n";
char ch;
cin.get(ch);
cout << "The next input character is " << ch << endl;
if (ch != '\n')
cin.ignore(Limit, '\n'); // discard rest of line
cout << "Enter a string for get() processing:\n";
cin.get(input, Limit, '#');
cout << "Here is your input:\n";
cout << input << "\nDone with phase 2\n";
cin.get(ch);
cout << "The next input character is " << ch << endl;
/* keeping output window open */
/*
cin.clear();
while (cin.get() != '\n')
continue;
cin.get();
*/
return 0;
}
方法 | 行为 |
---|---|
getline(char*, int) | 如果没有读取任何字符,如立刻达到了文件尾(但换行符被视为读了一个字符),则设置failbit ; 如果读取了最大数目的字符,且行中还有其它字符,则设置failbit |
get(char*, int) | 如果没有读取任何字符,则设置failbit;如果读取了最大数目的字符则不设置failbit; |