3

C++ を使用するのは久しぶりで、空き時間に Javascript を使用していましたが、今では何を覚えているのか正確にはわかりません。

基本的に、スペースを見て文字列をパーツに分けるだけです。

私が見たすべてのリンクは自家製の関数ですが、ストリームを使用して標準ライブラリを使用してそれを行う方法があると断言できましたが、繰り返しますが、それを思い出すのに苦労しており、Googleの結果はそうではありませんどちらかを助けます。

これは私が取得しているストリームではないことに注意してください。これは「ボブ会計士 65 退職」のような単なる文字列であり、文字列内の各項目を独自のデータ フィールドに抽出する必要があります。私は ifstreams と ofstreams をいじっていますが、その構文を忘れてしまったので、自分が何をしているのかさえわかりません。

4

3 に答える 3

5

std::strtokそれを行うCスタイルの方法です。を使用することを考えているかもしれませんstd::stringstream

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::string input = "foo bar baz  quxx\nducks";
    std::stringstream ss(input);

    std::string word;
    while (ss >> word) {
        std::cout << word << '\n';
    }
}

実行すると、次のように表示されます。

foo
bar
baz
quxx
ducks

std::stringstreama (または実際には任意の型) から特定のデータ型にデータを読み取りたい場合はstd::istream、データ型のストリームをオーバーロードするという @JerryCoffin の優れた提案に従うことができますoperator>>

#include <sstream>
#include <string>
#include <iostream>

struct Employee {
    std::string name;
    std::string title;
    int age;
    std::string status;
};

std::istream& operator>>(std::istream &is, Employee &e) {
    return is >> e.name >> e.title >> e.age >> e.status;
}

int main() {
    std::string input = "Bob Accountant 65 retired";
    std::stringstream ss(input);

    Employee e;
    ss >> e;

    std::cout << "Name: " << e.name
        << " Title: " << e.title
        << " Age: " << e.age
        << " Status: " << e.status
        << '\n';
}
于 2013-09-30T02:17:06.080 に答える
3

次のような明示的なループなしで実行できます。

string s = "Bob Accountant 65 retired";
vector<string> vs;
istringstream iss(s);
copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vs));

std::copy3 行目で作成された文字列ストリームからすべてを読み取り、2 行目で作成されたベクトルにプッシュします。

これはideoneのデモです。

于 2013-09-30T02:20:12.653 に答える
1

一見すると、文字列から論理レコードを読み取ろうとしています。そのために、私は次のようなことをします:

struct record { 
    std::string name;
    std::string position;
    int age;
    std::string status;
};

std::istream &operator>>(std::istream &is, record &r) { 
    return i >> r.name >> r.position >> r.age >> r.status;
}

これにより、指定したフィールドのa から astringstreamにデータを読み取ることができます。ついでに言うと、他のタイプのストリームからもオブジェクトrecordを読み取ることができます(たとえば、 を使用したファイルから)。recordfstream

于 2013-09-30T03:22:00.547 に答える