cin输入流的操作
一.cin流
- test1
void test1() {
char str1[20], str2[20];
cin >> str1 >> str2;
cout << "str1:" << str1 << ",str2:" << str2 << endl;
}
- test2
void test2() {
char ch1, ch2;
cin >> ch1 >> ch2;
cout << "ch1;" << ch1 << ",ch2:" << ch2 << endl;
}
- test3
void test3() {
char str1[20], str2[20];
cin >> str1 >> str2;
cout << "str1:" << str1 << ",str2:" << str2 << endl;
char ch1, ch2;
cin >> ch1 >> ch2;
cout << "ch1;" << ch1 << ",ch2:" << ch2 << endl;
}
cin流总结:
由上面三个程序可以看出, cin流可以直接过滤掉 空白部分(换行符,制表符,空格)再进行流输入
二.get
- 官方文档中get用法
int get();
istream &get( char &ch );
istream &get( char *buffer, streamsize num );
istream &get( char *buffer, streamsize num, char delim );
istream &get( streambuf &buffer );
istream &get( streambuf &buffer, char delim );
说明:
1.返回类型是 istream& , 说明必须使用 cin.get() 形式,这样才能返回 istream&类型
2.使用get读取 num-1 个字符到 buffer 中,相当于一个字符一个字符的读取,途中如果遇到 EOF、delim时停止。
- test
void test() {
char str1[20], str2[20];
cin >> str1 >> str2;
cout << "str1:" << str1 << ",str2:" << str2 << endl;
char ch1, ch2;
cin.get(ch1);//这里会读取遗留在缓冲区中的回车,也就是换行符,换行符在ASCII表中的数值是10
cin.get(ch2);
cout << "ch1(强转为int):" << (int)ch1 << ",ch2(强转为int):" << (int)ch2 << endl;
}
注意此处ch1读取遗留在缓冲区中的回车,也就是换行符,换行符在ASCII表中的数值是10,原因是之前cin输入流遗留了一个回车在缓冲区。
istream &get( char *buffer, streamsize num, char delim );
此时,停止向缓冲区读取的情况有三种:
1.已经读了9个字符, 但是需要注意缓冲区中仍然存留着字符
2.读到’d’ 字符,但是需要注意缓冲区中仍然存留着字符
3.读到EOF(一般在文件中才会出现)
- 情况一
void test1() {
char buffer[20];
cin.get(buffer, 10, 'd');
cout << "buffer:" << buffer << endl;
char ch;
cin.get(ch);
cout << "ch:" << ch << endl;
}
- 情况二
三.getline
- getline的官方文档
istream &getline( char *buffer, streamsize num );
istream &getline( char *buffer, streamsize num, char delim );
与get用法类似,但是不同的一点就是getline在遇到换行符时会终止,并把’\n’自动转化为’\0’,加入到buffer中,如test1所示:
- test1
void test1() {
char buffer[20];
cin.getline(buffer, 20);
cout << "buffer:" << buffer << endl;
cout << "buffer[4]:" << (int)buffer[4] << endl;
char ch;
cin.get(ch);
cout << "ch:" << ch << endl;
}
输入:
a[空格]b[制表符]c
输出:
四 ignore和sync
如果缓存区中还有未输出的字符,影响接下来的输入,那么则需要进行清空缓存区。
1. ignore
- 官方文档
istream &ignore( streamsize num=1, int delim=EOF );
void test() {
char ch1, ch2;
cin.get(ch1);
cin.ignore();
cin.get(ch2);
cout << "ch1:" << ch1 << ",ch2:" << ch2 << endl;
}
2.sync
关于cin.sync()有很多时候的环境配置下无法使用,就不再做更多讨论。