0

入力ストリームからスペースで区切られたデータを読み取る方法に問題があります。

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;

ただし、1 つ問題があります。「F 1 23 2 2 W」と入力すると、F12322@ が表示されます。末尾に「@」が付いている理由がわかりません。何かご意見は?

EDIT2:

std::cin.clear();

whileループの後、問題は解決します。

4

2 に答える 2

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);
}
于 2015-01-17T14:26:03.877 に答える
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

于 2015-01-17T14:10:39.193 に答える