string reading with sscanf

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Bint

    string reading with sscanf

    i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry" etc

    i can use sscanf(string," success=%d", &d) to get the success value. but
    after that i just want to read name and u pairs until there are no more. if
    Iwere to do a
    sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values of
    the first u/name, right? is there any way to retrieve the string pointer
    position from sscanf so that I can just call it again from that point in the
    string?

    thanks
    B


  • =?utf-8?Q?David_C=C3=B4me?=

    #2
    Re: string reading with sscanf

    On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.comw rote:
    i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry"
    etc
    >
    i can use sscanf(string," success=%d", &d) to get the success value. but
    after that i just want to read name and u pairs until there are no
    more. if
    Iwere to do a
    sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me thevalues
    of
    the first u/name, right? is there any way to retrieve the string pointer
    position from sscanf so that I can just call it again from that point in
    the
    string?
    >
    thanks
    B
    >
    >
    use ostringstream and istringstream instead of sscanf.

    Comment

    • Bint

      #3
      Re: string reading with sscanf

      I don't think my compiler has that. Is that part of standard C/C++? Is
      there an include file for it?

      Thanks
      B


      "David Côme" <davidcome@wana doo.frwrote in message
      news:op.t4xkrqj urttu86@debian. ..
      On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.comw rote:
      i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry"
      etc
      >
      i can use sscanf(string," success=%d", &d) to get the success value. but
      after that i just want to read name and u pairs until there are no more.
      if
      Iwere to do a
      sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values
      of
      the first u/name, right? is there any way to retrieve the string pointer
      position from sscanf so that I can just call it again from that point in
      the
      string?
      >
      thanks
      B
      >
      >
      use ostringstream and istringstream instead of sscanf.


      Comment

      • =?utf-8?Q?David_C=C3=B4me?=

        #4
        Re: string reading with sscanf

        On Mon, 14 Jan 2008 18:50:20 +0100, Bint <bint@csgs.comw rote:
        I don't think my compiler has that. Is that part of standard C/C++? Is
        there an include file for it?
        >
        Thanks
        B
        >
        >
        "David Côme" <davidcome@wana doo.frwrote in message
        news:op.t4xkrqj urttu86@debian. ..
        On Mon, 14 Jan 2008 18:06:12 +0100, Bint <bint@csgs.comw rote:
        >
        >i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry"
        >etc
        >>
        >i can use sscanf(string," success=%d", &d) to get the success value. but
        >after that i just want to read name and u pairs until there are no
        >more.
        >if
        >Iwere to do a
        >sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values
        >of
        >the first u/name, right? is there any way to retrieve the string
        >pointer
        >position from sscanf so that I can just call it again from that point in
        >the
        >string?
        >>
        >thanks
        >B
        >>
        >>
        use ostringstream and istringstream instead of sscanf.
        >
        >
        ostringstream and istringstream are standard classes of C++
        PS: Don't reply at top.

        Comment

        • Bint

          #5
          Re: string reading with sscanf

          ok thank you I got it. it's not clear right off how to use that do what I'm
          trying to do though, i haven't really used streams at all


          Comment

          • =?utf-8?Q?David_C=C3=B4me?=

            #6
            Re: string reading with sscanf

            On Mon, 14 Jan 2008 19:00:33 +0100, Bint <bint@csgs.comw rote:
            ok thank you I got it. it's not clear right off how to use that do what
            I'm
            trying to do though, i haven't really used streams at all
            >
            >

            Generaly use C++ tools when you can and C tools when you must.
            So use std::string instead of array of char,stream instead of FILE* ....

            Comment

            • James Kanze

              #7
              Re: string reading with sscanf

              On Jan 14, 6:41 pm, David Côme <davidc...@wana doo.frwrote:
              On Mon, 14 Jan 2008 18:06:12 +0100, Bint <b...@csgs.comw rote:
              i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry"
              etc
              i can use sscanf(string," success=%d", &d) to get the success
              value. but after that i just want to read name and u pairs
              until there are no more. if Iwere to do a
              sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values
              of the first u/name, right? is there any way to retrieve
              the string pointer position from sscanf so that I can just
              call it again from that point in the string?
              use ostringstream and istringstream instead of sscanf.
              I'm not sure that either are really appropriate here. If I've
              understood him correctly, he's got a '&' separated list of
              attribute value pairs. The easiest way of handling this is
              probably something like my FieldArray classes; a first pass
              which converts the string into a vector of strings, with one
              attribute value pair in each element. Then split up the
              elements into the attribute and the value (perhaps
              std::transform with a conversion function---boost::regex could
              probably help here).

              --
              James Kanze (GABI Software) email:james.kan ze@gmail.com
              Conseils en informatique orientée objet/
              Beratung in objektorientier ter Datenverarbeitu ng
              9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

              Comment

              • Daniel T.

                #8
                Re: string reading with sscanf

                "Bint" <bint@csgs.comw rote:
                i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry" etc
                >
                i can use sscanf(string," success=%d", &d) to get the success value. but
                after that i just want to read name and u pairs until there are no more. if
                Iwere to do a
                sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values of
                the first u/name, right? is there any way to retrieve the string pointer
                position from sscanf so that I can just call it again from that point in the
                string?
                I would do something like this:


                #include <algorithm>
                #include <iostream>
                #include <iterator>
                #include <sstream>
                #include <string>

                using namespace std;

                istream& find( istream& is, char c )
                {
                find( istream_iterato r<char>( is ), istream_iterato r<char>(), c );
                return is;
                }

                int main()
                {
                const char* str =
                "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry";

                stringstream ss( str );
                find( ss, '=' );
                int i = 0;
                ss >i;
                cout << "success = " << i << '\n';
                int u;
                string name;
                while ( find( ss, '=' ) && ss >u &&
                find( ss, '=' ) && getline( ss, name, '&' ) )
                {
                cout << "u = " << u << " name = " << name << '\n';
                }
                }

                Comment

                • aaragon

                  #9
                  Re: string reading with sscanf

                  On Jan 14, 3:39 pm, "Daniel T." <danie...@earth link.netwrote:
                  "Bint" <b...@csgs.comw rote:
                  i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry" etc
                  >
                  i can use sscanf(string," success=%d", &d) to get the success value. but
                  after that i just want to read name and u pairs until there are no more. if
                  Iwere to do a
                  sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values of
                  the first u/name, right? is there any way to retrieve the string pointer
                  position from sscanf so that I can just call it again from that point in the
                  string?
                  >
                  I would do something like this:
                  >
                  #include <algorithm>
                  #include <iostream>
                  #include <iterator>
                  #include <sstream>
                  #include <string>
                  >
                  using namespace std;
                  >
                  istream& find( istream& is, char c )
                  {
                  find( istream_iterato r<char>( is ), istream_iterato r<char>(), c );
                  return is;
                  >
                  }
                  >
                  int main()
                  {
                  const char* str =
                  "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry";
                  >
                  stringstream ss( str );
                  find( ss, '=' );
                  int i = 0;
                  ss >i;
                  cout << "success = " << i << '\n';
                  int u;
                  string name;
                  while ( find( ss, '=' ) && ss >u &&
                  find( ss, '=' ) && getline( ss, name, '&' ) )
                  {
                  cout << "u = " << u << " name = " << name << '\n';
                  }
                  >
                  }
                  I would use a tokenizer to do that. You can use the boost tokenizer
                  for that giving the token & or you can create your own by reading each
                  character and comparing it with '&' to separate the whole string in
                  tokens.

                  Comment

                  • Jerry Coffin

                    #10
                    Re: string reading with sscanf

                    In article <13on5kmk10elr2 e@corp.supernew s.com>, bint@csgs.com says...
                    i have a string "success=1&u=0& name=bint&u=1&n ame=lucy&u=2&na me=barry" etc
                    >
                    i can use sscanf(string," success=%d", &d) to get the success value. but
                    after that i just want to read name and u pairs until there are no more. if
                    Iwere to do a
                    sscanf (string,"succes s=%d&u=%d&name= %s"), that would get me the values of
                    the first u/name, right? is there any way to retrieve the string pointer
                    position from sscanf so that I can just call it again from that point in the
                    string?
                    You've gotten a couple of suggestions already, but I'll throw another
                    into the mix, just for fun:

                    // warning: only minimally tested. Makes no attempt at verifying or
                    // reacting reasonably to bad input.
                    #include <sstream>
                    #include <algorithm>
                    #include <map>
                    #include <iostream>
                    #include <string>
                    #include <stdlib.h>

                    // the real guts: read a single 'name=value' pair. Written as a template
                    // so the value can be an int, string, or anything else we can extract
                    // from a stream.
                    template<class T>
                    std::istream &getvalue(std:: istream &is, T &value) {
                    // first read the whole 'name=value' pair
                    std::string temp;
                    std::getline(is , temp, '&');

                    // then find the value part:
                    int pos = temp.find('=');
                    std::string temp2(temp.subs tr(pos+1,-1));

                    // and read the value:
                    std::stringstre am t(temp2);
                    t >value;
                    return is;
                    }

                    typedef std::pair<int, std::stringunam e;

                    // not technically allowed, but won't be found unless in std namespace:
                    namespace std {
                    std::istream &operator>>(std ::istream &is, uname &un) {
                    getvalue(is, un.first);
                    getvalue(is, un.second);
                    return is;
                    }

                    std::ostream &operator<<(std ::ostream &os, uname const &un) {
                    return os << un.first << ":\t" << un.second;
                    }
                    }

                    int main() {
                    std::stringstre am input("success= 1&u=0&name=bint "
                    "&u=1&name=lucy &u=2&name=barry ");

                    std::map<int, std::stringvalu es;

                    int success;
                    getvalue(input, success);

                    // read in the data
                    std::copy(std:: istream_iterato r<uname>(input) ,
                    std::istream_it erator<uname>() ,
                    std::inserter(v alues, values.begin()) );

                    // and display what we read:
                    std::copy(value s.begin(), values.end(),
                    std::ostream_it erator<uname>(s td::cout, "\n"));
                    return 0;
                    }

                    --
                    Later,
                    Jerry.

                    The universe is a figment of its own imagination.

                    Comment

                    Working...