目录
控制台 I/O: cin 输入
1. 重载的>>运算符
重载的>>运算符使得cin能识别所有的基本类型,同时也支持char*型来提供字符串数据的输入,可以使用:
cin >> dec; //hex/oct 来指定输入的数据是什么进制的
对于输入数据,还可以指定进制来决定输入的数据:
int x;
cin >> hex >> x;
2. cin 的特点
cin会跳过空白(空格,制表符和换行),直到遇到非空白字符,然后在遇到下个空白或者与目标类型不匹配的第一个字符为止。如以下代码:
int x, y;
cin >> x >> y;
cout << "x=" << x <<",y=" << y << endl;
对于以下输入有:
//输入1
3 4 //结果为x=3,y=4,因为会跳过最开始的空白,如果想接收空白的话,要用cin.get()
//输入2
3a 4 //结果为x=3,y=0
对于第二个输入,因为字符a不符合int,所以x到这里就停止了,但是a还在输入缓冲中,y去取数据的时候发现第一个值为a,不符合其数据类型,但直接返回 0。
3. 其他输入方法
3.1 单字符输入: get()
如果不想忽略空白的话,可以用cin.get()
,它有两种形式,get()
和get(char &ch)
都接收空白输入,get()
函数读取下一个输入字符,并将该字符转换为整型后返回;get(char &ch)
将输入字符赋给其参数,返回的是一个指向调用它的istream
对象的引用,这意味着get(char &)
接受拼接输入:
char c1, c2, c3;
cin.get(c1).get(c2) >> c3; //c1,c2不跳过空白,c3会跳过空白
对于get()
方法的话,如果到达了文件尾,则会返回常量 EOF(在文件<iostream>
中定义),所以对于它的话,循环读取的写法如下:
while (cin.get() != EOF) {}
对于get(char&)
的话,如果到达了文件尾,get(char &)
会自己调用setstate(failbit)
导致cin
的结果为false
:
char ch;
while (cin.get(ch)) { //如果到达文件尾的话,会返回false
cout << ch;
}
3.2 字符串输入: get()/getline()
字符串输入方式有以下几种,但是要注意,下面的方法都会影响文件偏移量:
istream & get(char *, int, char);
istream & get(char *, int);
istream & getline(char *, int, char);
istream & getline(char *, int);
第一个参数用于存储输入的字符串,第二个参数需要比要读取的最大字符数 + 1(额外的一个字符用于存储结尾的空字符,以便将输入存储为一个字符串),第三个参数用于指定分界符。两个参数的版本的话就将换行符用作分界符,有分界符的版本会在遇到分界符后就停止输入,即使还没到读取的最大数目上述函数都在读取最大数目的字符或遇到换行符后为止。
get()
和getline()
的主要区别在于,get()
将换行符留在输入流中,这样接下来的输入操作首先看到的是换行符,而getline()
的话会丢弃输入流中的换行符。
还有个忽略函数ignore()
,原型为:
istream & ignore(int i = 1, int = EOF);
第一个参数是要读取的最大字符,第二个参数指定了分界符,这个函数会读取指定的字符数或到达了分界符,然后把读到的数据丢掉。
3.3 其他的输入函数
read
函数可以读取指定数目的字节,并将它们存储在指定的位置中:
char temp[21];
cin.read(temp, 21);
与get
和getline
不同的是,read
不会在输入后自动加上空字符,因此不能将输入转换为字符串,它常与ostream write()
函数结合使用,来完成文件输入和输出。
peek
函数返回输入中的下一个字符,但不抽取输入流中的字符,也就是一个看看的函数。
char temp[50];
char ch;
int i = 0;
while ( (ch = cin.peek() != '.') && ch != '\n') { //如果下一个字符不是句点或者换行符,则读取该字符并保存至temp中
cin.get(temp[i++]);
}
temp[i] = '\0';
gcount
函数返回最后一个非格式化抽取方法(也就是不是cin
,像get
这类)读取的字符数,但其实也可以用strlen
函数来计算输入得到的字符数,这种方法比使用cin.gcount
更快。
putback
方法将一个字符插入到输入字符串中,被插入的字符将是下一条输入语句读取的一个字符。