自从我使用C ++已经很长时间了,在我的空闲时间使用Javascript,现在我不确定我记得的是什么。
基本上我只需要通过查看空格将字符串分成几部分。
我看到的所有链接都是自制功能,但我可以发誓有一种方法可以使用标准库通过使用流来实现它,但同样,我很难回忆起它和我的谷歌搜索结果也没有帮助。
请记住,它不是我正在使用的流,它只是一个像“Bob Accountant 65 retired”这样的字符串,我必须将字符串中的每个项目提取到自己的数据字段。我一直在搞乱ifstreams和ofstreams但是我甚至不确定我在做什么,忘记了它的语法。
答案 0 :(得分: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::stringstream
(或任何类型的std::istream
)的数据读入特定数据类型,您可以按照@JerryCoffin关于重载流{{1}的优秀建议}对于您的数据类型:
operator>>
答案 1 :(得分: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
从第三行创建的字符串流中读取所有内容,并将其推送到第二行创建的向量中。
答案 2 :(得分: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;
}
这使您可以从指定字段的stringstream
到record
读取数据。顺便提一下,它也允许您从其他类型的流中读取record
个对象(例如,使用fstream
从文件中读取)。