Hi All! I'm having a problem passing strings into a boost tokenizer. I have been able to get the code to work but I don't think I should have had to do what I did. I don't know if it is tokenizer problem or a compiler problem or my problem. Basically, I start with a char[] and depending on how I convert it to an std::string, I may or may not get garbage tokens. I've attached a complete, but small, program to demonstrate the problem. I hope someone can tell what is going on. I'm using a Fedora 8 system with g++ v 4.1.2. Thanks in advance! Medora #include <iostream> #include <string> #include <boost/tokenizer.hpp> using namespace std; char *in_strs[] = { "S,1001,101,39.6511915386591,-108.199469861370,1240151.6,127361.5", "S,1001,111,39.6511191997175,-108.199521016802,1240136.4,127335.6", "S,1001,121,39.6510468691093,-108.199571817158,1240121.3,127309.7", "S,1001,131,39.6509745384787,-108.199622617407,1240106.2,127283.8", "S,1001,141,39.6509021994691,-108.199673772516,1240091.0,127257.9", "S,1001,151,39.6508298687935,-108.19972457255,1240075.9,127232.0", "S,1001,161,39.6507575380953,-108.199775372477,1240060.8,127206.1", "S,1001,171,39.6506851990178,-108.199826527263,1240045.6,127180.2", "S,1001,181,39.6506125938775,-108.199877316164,1240030.5,127154.2", NULL }; int main(int argc, char* argv[]) { typedef boost::tokenizer<boost::char_separator<char> > str_tokenizer; boost::char_separator<char> sep(","); cout << endl; #if 1 // Here I'm just tokenizing the strings and writing them out. // This version works. char **str = in_strs; while (*str){ string file1_str = *str; str_tokenizer file1_tokens(file1_str, sep); for(str_tokenizer::iterator iter=file1_tokens.begin(); iter!=file1_tokens.end();++iter){ cout << *iter << " "; } ++str; cout << endl; } #endif #if 0 // This version results in garbage in some tokens. char **str = in_strs; while (*str){ str_tokenizer file1_tokens(string(*str), sep); // <-- difference for(str_tokenizer::iterator iter=file1_tokens.begin(); iter!=file1_tokens.end();++iter){ cout << *iter << " "; } ++str; cout << endl; } #endif //==================================================================================================== #if 0 // Now I want to skip the first 2 characters of the string. // This version works. string file1_str; char **str = in_strs; while (*str){ string file1_str = *str; string sub1 = file1_str.substr(2); // <-- difference str_tokenizer file1_tokens(sub1, sep); // <-- difference for(str_tokenizer::iterator iter=file1_tokens.begin(); iter!=file1_tokens.end();++iter){ cout << *iter << " "; } ++str; cout << endl; } #endif #if 0 // This version results in garbage in some tokens. string file1_str; char **str = in_strs; while (*str){ string file1_str = *str; str_tokenizer file1_tokens(file1_str.substr(2), sep); // <--- difference for(str_tokenizer::iterator iter=file1_tokens.begin(); iter!=file1_tokens.end();++iter){ cout << *iter << " "; } ++str; cout << endl; } #endif return(0); }
AMDG Medora Schauer wrote:
I'm having a problem passing strings into a boost tokenizer. I have been able to get the code to work but I don't think I should have had to do what I did. I don't know if it is tokenizer problem or a compiler problem or my problem.
// This version results in garbage in some tokens. char **str = in_strs; while (*str){ str_tokenizer file1_tokens(string(*str), sep); // <-- difference
tokenizer stores the string by reference. The temporary string is destroyed. Boom. In Christ, Steven Watanabe
Ah! I wasn't even considering where the string was getting created. It's on the call stack I guess? Thanks!
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users- bounces@lists.boost.org] On Behalf Of Steven Watanabe Sent: Thursday, March 12, 2009 11:56 AM To: boost-users@lists.boost.org Subject: Re: [Boost-users] tokenizer problem
AMDG
Medora Schauer wrote:
I'm having a problem passing strings into a boost tokenizer. I have been able to get the code to work but I don't think I should have had to do what I did. I don't know if it is tokenizer problem or a compiler problem or my problem.
// This version results in garbage in some tokens. char **str = in_strs; while (*str){ str_tokenizer file1_tokens(string(*str), sep); // <-- difference
tokenizer stores the string by reference. The temporary string is destroyed. Boom.
In Christ, Steven Watanabe
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Medora Schauer
-
Steven Watanabe