그래서 TCP winsock 연결을 통해 수신되는 데이터의 다음 문자열이 있으며 구조체의 벡터로 고급 토큰 화를하고 싶습니다. 각 구조체는 하나의 레코드를 나타냅니다.구조체의 벡터에 데이터 문자열을 토큰 화하는 중?
std::string buf = "44:william:adama:commander:stuff\n33:luara:roslin:president:data\n"
struct table_t
{
std::string key;
std::string first;
std::string last;
std::string rank;
std::additional;
};
문자열의 각 레코드는 캐리지 리턴으로 구분됩니다.
이void tokenize(std::string& str, std::vector<string>records)
{
// Skip delimiters at beginning.
std::string::size_type lastPos = str.find_first_not_of("\n", 0);
// Find first "non-delimiter".
std::string::size_type pos = str.find_first_of("\n", lastPos);
while (std::string::npos != pos || std::string::npos != lastPos)
{
// Found a token, add it to the vector.
records.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of("\n", pos);
// Find next "non-delimiter"
pos = str.find_first_of("\n", lastPos);
}
}
더 구조체로 (내부 필드 분리) 대장을 통해 각 레코드를 토큰 화 다시 그 모든 코드를 반복 완전히 불필요한 것 : 필드를 레코드를 분할,하지만 아직 분할에 내 시도 각 구조체를 벡터로 푸시합니다. 이렇게하는 더 좋은 방법이있을 것이라고 확신합니다. 아니면 디자인 자체가 잘못되었을 수도 있습니다.
도움 주셔서 감사합니다.
오히려 깔끔하게 할 당신이 부스트를 사용할 수있는 경우이 될 것이다 tokenizer 라이브러리, 문자열 알고리즘 라이브러리 또는 가장 강력한 솔루션 인'boost.spirit'을 사용하여 다음과 같이 작성할 수 있습니다. http://www.boost.org/doc/libs/1_46_1/libs/spirit/doc /html/spirit/qi/tutorials/employee___parsing_into_structs.html – Cubbi
이이 코멘트를 놓쳤습니다. +1이 경우에 사용되는 데이터 형식에 너무 무거울 때도 있습니다. – user237419
[boost :: tokenizer] (http://www.boost.org/doc/libs/1_46_1/libs/tokenizer/index.html)를 사용하십시오. – user237419