C++ stringstream格式化输出输入探索
4、cin.getline(s,k);
接收一行中k个字符,可以接收空格
cin.getline()实际有三个参数,cin.getline(字符串,接收个数,结束字符);
当第三个参数省略时,系统默认为'\0';
5、getline(cin,s);
和cin.getline()类似,读入一行字符串,值得注意的是cin.getline()属于istream流,而getline()属于string流,二者并不相同。
StringStream
这个东西单独讲,比较重要,包含在sstream库中。
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
stringstream类同时可以支持C风格的串流的输入输出操作。
然后stringstream的作用就是从string对象读取字符或字符串。
string s = "ABCD";
stringstream ss(s);
char ch;
while(ss>>ch){
cout << ch << " ";
}
//运行结果
//A B C D
又例如
string s = "hello world";
stringstream ss(s);
string str;
while(ss>>str){
cout << str << " ";
}
//运行结果
//hello world
- 例子程序:
int main()
{
string line;
int k = 1;
cout << "===============case1================" << endl;;
while (getline(cin, line)) //可与读到包含空格, ;等字符;但是在ss>>x时被截断
{
int sum = 0, x;
stringstream ss(line);
while (ss >> x)
{
sum += x;
}
cout << "the sum is :" << sum << endl;
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}
return 0;
}
- 输出
===============case1================ 1 2 3 4 5 the sum is :15 ===============case2================ 1,2,3,4,5 the sum is :1 ===============case3================ 1 a 2 b 3 the sum is :1 ===============case4================ a 1 1 1 1 the sum is :0 ===============case5================
- 另外一组:
int main()
{
string line;
int k = 1;
cout << "===============case1================" << endl;;
while (getline(cin, line))
{
string out, x;
stringstream ss(line);
while (ss >> x)
{
cout << x << ";";
}
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}
return 0;
}
- 输出:
===============case1================ this is very good! this;is;very;good!; ===============case2================ this,is,very,good! this,is,very,good!; ===============case3================
- 实验矩阵类型的输入:
3
0 1 2
2 3 4
5 6 7
int main()
{
string line;
int k = 1;
//测试矩阵形式的输入:
string input;
int n;
//cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
getline(cin, input);
stringstream ss(input);
ss >> n;
vector<vector<int> > vec;
for (int i = 0; i < n;i++)
{
getline(cin,input); //会将换行符当做一行
stringstream ss(input);
int x;
vector<int> temp;
while (ss>>x) //只能以空格处理分离
{
temp.push_back(x);
}
vec.push_back(temp);
}
return 0;
}
- 使用方法:
- input1是没有空格的,带有,;将矩阵的行列分出来;
- 但是使用cin>>k后,没有使用getline(input1), 应为input1本身是没有空格的字符串
- 经上面启发:练习这样的输入:
3 3 0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1
- 测试代码:
int main()
{
string line;
int k = 1;
int row, col;
getline(cin, line);
stringstream ss(line);
ss >> row >> col;
getline(cin, line); //第二行
stringstream s(line);
string temp1, temp2, temp3;;
vector<pair<pair<int,int>,pair<int,int>>> vec;
while (getline(s, temp1, ';'))
{
vector<pair<int, int>> pair1;
stringstream s3(temp1);
while (getline(s3, temp2,' ')) //以换行符结束,中间为空格
{
pair<int, int> pair2;
stringstream s4(temp2);
vector<int> res;
while (getline(s4, temp3, ','))
{
res.push_back(stoi(temp3));
}
pair2.first = res[0];
pair2.second = res[1];
pair1.push_back(pair2);
}
vec.push_back(make_pair(pair1[0],pair1[1]));
}
return 0;
}
- 输出:

- 另外参考输入遇到过问题的拼多多题解:推荐朋友 - LintCode
5 0
1 2 3
0 4
0 4
0 4
1 2 3
int main()
{
int N, id;
string str;
getline(cin, str);
stringstream ss(str);
ss >> N >> id;
vector<vector<int>> vec;
//for (int i = 0; i < N; i++)
//{
// vector<int> temp;
// int user;
// getline(cin, str);
// stringstream s(str);
// while (s>>user) //以空格进行划分
// {
// temp.push_back(user);
// }
// vec.push_back(temp);
//}
while (getline(cin, str)) //其实可都可以不知道行数
{
vector<int> temp;
int user;
stringstream s(str);
while (s >> user)
{
temp.push_back(user);
}
vec.push_back(temp);
}
cout << recommendFriends(vec, id) << endl;
return 0;
}
int test()
{
//int N,id;
//cin >> N >> id; //直接输入用户数和需要查找的用户id ; 这样就会产生换行符
int N;
vector<int> in;
char c;
while ((c = cin.get()) != '\n')
{
cin.unget();
cin >> N;
in.push_back(N);
}
vector<vector<int>> vec;
for (int i = 0; i < in[0]; i++)
{
vector<int> temp;
int user;
while ((c=cin.get())!= '\n') //文件结果没有换行符了,所以陷入死循环
{
cin.unget();
cin >> user;
temp.push_back(user);
}
if (temp.size()!=0)
{
vec.push_back(temp);
}
}
cout << recommendFriends(vec, in[1]) << endl;
return 0;
}
- 全部代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include<sstream>
#include<fstream>
using namespace std;
#define cin infile //一定不能再oj系统中,有错,导致超时等!!!
//C++文件输入
ifstream infile("ini.txt", ifstream::in);
//函数功能:将输入字符串s,以字符串c(;)进行拆分,拆分结果放在v中
//函数参数说明:s为输入字符串;c为拆分的字符串;v为拆分结果
//函数返回值:正常返回0
int split_string(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while (std::string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2 - pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if (pos1 != s.length())
v.push_back(s.substr(pos1));
return 0;
}
int main()
{
string line;
int k = 1;
/*cout << "===============case1================" << endl;;
while (getline(cin, line))
{
int sum = 0, x;
stringstream ss(line);
while (ss >> x)
{
sum += x;
}
cout << "the sum is :" << sum << endl;
++k;
cout << endl;
cout << "===============case" << k << "================" << endl;;
}*/
//cout << "===============case1================" << endl;;
//while (getline(cin, line))
//{
// string out, x;
// stringstream ss(line);
// while (ss >> x)
// {
// cout << x << ";";
// }
// ++k;
// cout << endl;
// cout << "===============case" << k << "================" << endl;;
//}
////测试矩阵形式的输入:
//string input;
//int n;
////cin >> n; //输入n行数据,如果后面用getline()后面的换行符不能处理
//getline(cin, input);
//stringstream ss(input);
//ss >> n;
//
//vector<vector<int> > vec;
//for (int i = 0; i < n;i++)
//{
// getline(cin,input); //会将换行符当做一行
// stringstream ss(input);
// int x;
// vector<int> temp;
// while (ss>>x) //只能以空格处理分离
// {
// temp.push_back(x);
// }
// vec.push_back(temp);
//}
int row, col;
getline(cin, line);
stringstream ss(line);
ss >> row >> col;
getline(cin, line); //第二行
stringstream s(line);
string temp1, temp2, temp3;;
vector<pair<pair<int,int>,pair<int,int>>> vec;
while (getline(s, temp1, ';'))
{
vector<pair<int, int>> pair1;
stringstream s3(temp1);
while (getline(s3, temp2)) //以换行符结束,中间为空格
{
pair<int, int> pair2;
stringstream s4(temp2);
vector<int> res;
while (getline(s4, temp3, ','))
{
res.push_back(stoi(temp3));
}
pair2.first = res[0];
pair2.second = res[1];
pair1.push_back(pair2);
}
vec.push_back(make_pair(pair1[0],pair1[1]));
}
return 0;
}


浙公网安备 33010602011771号