3

自从我使用 C++ 以来已经有很长时间了,在我的空闲时间一直在使用 Javascript,现在我不确定我到底记得什么。

基本上我只需要通过查看空格将字符串分成几部分。

我看到的所有链接都是自制函数,但我可以发誓有一种方法可以通过使用流来使用标准库来实现它,但是我又很难回忆起它,而且我的谷歌结果不是帮助。

请记住,这不是我要从中获取的流,它只是一个像“Bob Accountant 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

如果您想从 a std::stringstream(或任何类型的std::istream,真的)读取数据到特定的数据类型,您可以遵循@JerryCoffinoperator>>为您的数据类型重载流的极好建议:

#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::copy从第三行创建的字符串流中读取所有内容,并将其推送到第二行创建的向量中。

这是关于 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;
}

这使您可以从指定字段的stringstreama读取数据。record顺便说一句,它还可以让您record从其他类型的流中读取对象(例如,从使用 的文件中fstream)。

于 2013-09-30T03:22:00.547 回答