我遇到了如何从输入流中读取空格分隔数据的问题。
让我们说我们需要输入J 123 7 3 M.首先是字母,最后是字母。其余的是int。
vector<int> ints;
vector<char> chars;
stringstream ss;
...
cin >> c
chars.push_back(c);
ss << c;
cin >> i;
while(ss << i) {
ints.push_back(i);
}
...
但是这段代码无法解决问题。我尝试了很多组合,但仍然没有。
我原以为我可以将所有内容都读为char,然后将其转换为int。
我知道有类似的问题,但在我的情况下,我想解决没有字符串而不是动态数组(可能是动态数组,但没有设置长度)。
修改
我设法通过以下方式阅读此类文章:
char first, last;
int i;
std::cin >> first;
std::cout << first;
while(std::cin >> i) {
std::cout << i;
}
std::cin >> last;
std::cout << last;
但有一个问题: 写作&#34; F 1 23 2 2 W&#34;显示F12322 @。不知道为什么有&#34; @&#34;在末尾。 有什么想法吗?
EDIT2:
std::cin.clear();
在while循环解决问题之后。
答案 0 :(得分:1)
为了整理和添加您的数据,您可以创建一个小结构,例如operator>>
(ideone):
struct line{
char f1,f5; // give them meaningful names
int f2,f3,f4;
friend std::istream &operator>>(std::istream &is, line &l) {
is >> l.f1;
is >> l.f2;
is >> l.f3;
is >> l.f4;
is >> l.f5;
return is;
}
};
int main() {
string input = "J 123 7 3 M\nK 123 7 3 E\nH 16 89 3 M";
stringstream ss(input);
vector<line> v;
line current;
while(ss >> current){
v.push_back(current);
}
for (auto &val: v){
cout<< val.f1 << endl;
}
return 0;
}
每当您阅读某些内容时,您就可以使用current
行执行任何操作。如果每个留置权没有特定含义,你可以做一个
while(ss>>f1>>f2>>f3>>f4>>f5){
// do stuff with fields
}
其中ss
是stringstream
,但cin
可能就是{{1}}。
答案 1 :(得分:1)
如果您知道元素的数量及其类型,则可以使用以下代码
#include<vector>
#include<iostream>
using namespace std;
int main()
{
int i;
char c;
vector<int> ints;
vector<char> chars;
cin>>c;
chars.push_back(c);
for(int j=0;j<3;j++){
cin>>i;
ints.push_back(i);
}
cin>>c;
chars.push_back(c);
}