读取空间分隔数据并将其推入适当的容器中

时间:2015-01-17 13:45:39

标签: c++ stringstream istringstream ostringstream

我遇到了如何从输入流中读取空格分隔数据的问题。

让我们说我们需要输入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循环解决问题之后

2 个答案:

答案 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
}

其中ssstringstream,但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);
}