(一)cin>>
1.1 cin>>读取一个字符
- cin>>相当于cin.operator>>(),即调用成员operator>>() 进行读取数据
- 当cin>>读取缓冲区数据第第一个数据为空格、tab、或者换行等字符分隔符时,会将之忽略并清除掉,接着读取下一个数据,如果缓冲区为空,则阻塞等待。等数据读取成功后,后面剩余的分隔符会留在缓冲区中,cin>>不会处理。
void test1()
{
vector<char> ve;
for (int i = 0; i < 10; i++)
{
char tmp; cin >> tmp;
ve.push_back(tmp);
}
copy(ve.begin(), ve.end(), ostream_iterator<char>(cout));
cout << endl;
}
1.2 cin>>读取一个字符,使用noskipws控制,;
- 使用noskipws,可以控制输入流不要略过空白字符
void test2()
{
vector<char> ve;
for (int i = 0; i < 10; i++)
{
char tmp; cin >> noskipws >> tmp;
ve.push_back(tmp);
}
copy(ve.begin(), ve.end(), ostream_iterator<char>(cout));
cout << endl;
}
(二)cin.get()
cin.get()函数有多种重载形式,大致分为四种,第一种无参数;第二种一个参数;第三种二个参数;第四种三个参数
2.1 输入一个字符
- cin.get()函数从输入缓冲区读取单个字符时不忽略分隔符,直接将数据取出来打印;
- cin.get()的返回值为int型,成功返回读取字符的ASKLL码值,遇到文件结束符(window下为Ctrl+z,Linux下为Ctrl+d)时返回EOF,即-1。
void test3()
{
char ch1, ch2, ch3;
int i = 10;
vector<char> ve;
//ch1 = cin.get(); //无参使用
//ch2 = cin.get();
//ch3 = cin.get();
cin.get(ch1).get(ch2).get(ch3); //一个参数的使用(支持连用)
cout << ch1 << ch2 << ch3;
}
2.2 输入一行字符
- cin.get(arr, 10),在读取一行时,遇到换行符结束读取,但是不对换行符进行处理,换行符会遗留在缓存中。下一次cin.get()的时候,就会将上一次剩余的数据读取出来。(注:getline读取一行字符时,遇到换行符中止,并将换行符从缓冲区删除掉)
- cin.get(str,size);在读取一行字符串时, 只能将字符串读取到char*类型的字符串中,但是C++的getline函数可以将字符串读取到string类型中,因为string是增长字符串,使用起来更加方便,多以较多的使用getline函数。
void test5()//cin.getline(),读取一行
{
char arr[10] = {};
//cin.getline(arr, 10); //两个参数的使用
cin.getline(arr, 10, '0');//三个参数的使用,将字符0设置为结束符
char ch = cin.get();
cout << arr << "***" << ch;
}
两个参数:
三个参数:
(三)cin.getline()
3.1 读取一行
- cin.getline()和cin.get()两个函数之间的区别是,cin.getline()函数不会把结束符或者换行符遗留在缓存区中;
- 当再一次cin.getline()时,将跳过结束符接着读取剩余的数据
void test5()
{
char arr[10] = {};
cin.getline(arr, 10);//两个参数的使用
//cin.getline(arr, 10, '0');//三个参数 的使用,将字符0设置为结束符
char brr[10];
cin.getline(brr, 5);
cout << arr << "***" << brr;
}
两个参数:
三个参数: