在各类算法竞赛和机试中,对测试数据和输出格式往往会有明确的规定,笔者结合个人刷题经历,得到了以下C++语言输入输出控制的方法。
cin:从缓冲区中读取数据
cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理
cin.get():读一个字符
cin.get()
cin.get()从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取
即 cin.get()不舍弃行尾换行符 ==> 消除行尾换行符
getline():读整行数据
读取一行数据,并将分隔符之外的元素存储到指定数据结构中。
getline(cin,s)可以一次性读取自带空格的一行数据,弃行尾的换行符
getline (istream& is, string& str, char delim);
将is中的数据读入str中,delim中的符号不存储(delim截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理)
<< 表示数据流向
字符串流(stringstream):字符串I/O、数据类型转换
字符串流(stringstream)是一种特殊的流类,它允许将字符串作为输入和输出流进行处理。
头文件
其他类型转string:
std::stringstream ss;
ss << num;
string转其他类型:
使用类似cin的形式
std::string str = "12345";
std::stringstream ss(str);
int num;
ss >> num;
使用getline处理:
getline(str,s,',')//将str流中“,”分割的元素存入s中
读取一行整数放入vector中
(1)使用cin.get()
vector<int> a;
vector<int> b;
string line, word;
int temp;
//放入第一个字符,注意cin是会对第一个换行符视而不见的
cin >> temp;
a.push_back(temp);
//直到读取到换行符结束
while (cin.get() != '\n')
{
cin >> temp;
a.push_back(temp);
}
(2)使用cin.getline()
getline(cin, line);
//将记录绑定到刚刚读取的行,用到了sstream里面的对象
istringstream record(line);
while (record >> word)
{
b.push_back(atoi(word.c_str()));
}
while(t–):行数固定
总行数已知
int t;
cin>>t;
while(t--){
//处理每行数据
}
while(cin &&):输入0结束循环
while(cin>>t&&t)//判断当前读取数据是否为0
while(cin):输入多组数据(任意组)
不指定数据组数量,例如EOF
while(cin>>a>>b)//可反复输入,直到没有读取到输入结束