我对C ++很陌生,并且正在寻找一种从数据库中提取数据的好方法。
我可能需要标记的示例行是
f 11/65/11 16/70/16 17/69/17
我有一个令牌化方法,它将字符串拆分为一个由字符串分隔的向量,这可能很有用
static void Tokenise(const string& str, vector<string>& tokens, const string& delimiters = " ")
我能想到的唯一方法就是用“”作为分隔符进行标记,从结果向量中删除第一个项目,然后单独标记每个部分。是否有一种很好的方法可以一起做到这一点?
答案 0 :(得分:3)
我看到问题被标记为C ++,但绝对最简单的方法是使用scanf
int indices[3][3];
sscanf(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d", &indices[0][0], &indices[0][1],...);
答案 1 :(得分:3)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
class parse_error : public std::exception {};
template< typename Target >
inline Target convert_to(const std::string& value)
{
std::istringstream iss(value);
Target target;
iss >> target >> std::ws;
if(!iss || !iss.eof()) throw parse_error();
return target;
}
template< typename T >
inline T read_delimited_value(std::istream& is, char delim)
{
std::string value;
std::getline(is,value,delim);
if(!is) throw parse_error();
return convert_to<T>(value);
}
template< typename It >
inline void output(std::ostream& os, It begin, It end)
{
while(begin!=end)
os << *begin++ << ' ';
}
int main()
{
std::vector<int> values;
const std::string line = "f 11/65/11 16/70/16 17/69/17";
std::istringstream iss(line);
std::string value;
std::getline(iss,value,' ');
if(value!="f" || !iss) throw parse_error();
while(iss.good()) {
values.push_back( read_delimited_value<int>(iss,'/') );
values.push_back( read_delimited_value<int>(iss,'/') );
values.push_back( read_delimited_value<int>(iss,' ') );
}
if(!iss.eof()) throw parse_error();
output( std::cout, values.begin(), values.end() );
std::cout << '\n';
return 0;
}
答案 2 :(得分:2)
你应该看看Boost.Tokenizer,尤其是:
// char_sep_example_1.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
int main()
{
std::string str = ";;Hello|world||-foo--bar;yow;baz|";
typedef boost::tokenizer<boost::char_separator<char> >
tokenizer;
boost::char_separator<char> sep("-;|");
tokenizer tokens(str, sep);
for (tokenizer::iterator tok_iter = tokens.begin();
tok_iter != tokens.end(); ++tok_iter)
std::cout << "<" << *tok_iter << "> ";
std::cout << "\n";
return EXIT_SUCCESS;
}
答案 3 :(得分:1)
从样本行判断,您可以使用两个分隔符''和'/',您将获得所有数字。
static void Tokenise(const string& str, vector<string>& tokens, const string& delimiters = " /")
答案 4 :(得分:0)
您可以轻松地移除第一个部分,直到第一个空白或刚好在f之后(您可以在第一个空白之后获得剩余部分
istringstream iss( line );
std::getline( iss, restStr ,' ' )
然后你可以先在空格上使用你的tokenize函数然后在'/'上,或者在一个循环中使用一组std :: getline和istringstreams。
int main()
{
std::string s = "f 1/2/3 4/4/2";
std::istringstream issLine( s );
std::string result;
// remove the first "f"
std::getline( issLine, result, ' ' );
// parse blanks
while( std::getline( issLine, result, ' ' ) )
{
std::istringstream issToken( result );
std::string token;
//parse content
while( std::getline( issToken, token, '/' ))
{
std::cout << token << ',';
// add your data in whatever you want
}
std::cout << std::endl;
}
}