Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > istringstream "hexadecimal string" value

Reply
Thread Tools

istringstream "hexadecimal string" value

 
 
ma740988
Guest
Posts: n/a
 
      10-27-2004
The string object value_f doesn't produce the right output. At issue,
- I suspect - is the conversion from string to int with istringstream.
An alternate approach? Thanks in advance

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

// Conversion Functions
template<typename T>
T fromString(const std::string& s) {
std::istringstream is(s);
T t;
is >> t;
return t;
}
template<typename T>
std::string toString(const T& t) {
std:stringstream s;
s << t;
return s.str();
}


//
// test function to convert values:
// 0xAFFF from string to int
// 0xAFFF from int to string

int main()
{

int d(0xAFFF);
string value_d = toString( d );
cout << "value_d is [" << value_d << "]" << endl;

string value_e( " 4999 " );
string value_f( " 0xAFFF " );

int val_1 = fromString<int>( value_e );
cout << "val_1 is [" << val_1 << "]" << endl;
int val_2 = fromString<int>( value_f );
cout << "val_2 is [" << val_2 << "]" << std::hex << endl;

}
 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      10-27-2004
"ma740988" <(E-Mail Removed)> wrote...
> The string object value_f doesn't produce the right output. At issue,
> - I suspect - is the conversion from string to int with istringstream.
> An alternate approach?


The default extraction operator with default format setting expects
a _decimal_ notation.

> Thanks in advance
>
> #include <iostream>
> #include <sstream>
> #include <string>
>
> using namespace std;
>
> // Conversion Functions
> template<typename T>
> T fromString(const std::string& s) {


Change to

T fromString(const std::string& s,
std::ios_base& (*f)(std::ios_base&) = std::dec) {


> std::istringstream is(s);
> T t;
> is >> t;


Change to

is >> f >> t;

> return t;
> }
> template<typename T>
> std::string toString(const T& t) {


Change to

std::string toString(const T& t,
std::ios_base& (*f)(std::ios_base&) = std::dec) {

> std:stringstream s;
> s << t;


Change to

s << f << t;

> return s.str();
> }
>
>
> //
> // test function to convert values:
> // 0xAFFF from string to int
> // 0xAFFF from int to string
>
> int main()
> {
>
> int d(0xAFFF);
> string value_d = toString( d );
> cout << "value_d is [" << value_d << "]" << endl;
>
> string value_e( " 4999 " );
> string value_f( " 0xAFFF " );
>
> int val_1 = fromString<int>( value_e );
> cout << "val_1 is [" << val_1 << "]" << endl;
> int val_2 = fromString<int>( value_f );


Change to

int val_e = fromString<int>( value_f, hex );

> cout << "val_2 is [" << val_2 << "]" << std::hex << endl;
>
> }


HTH

V


 
Reply With Quote
 
 
 
 
ma740988
Guest
Posts: n/a
 
      10-27-2004
"Victor Bazarov" <(E-Mail Removed)> wrote in message news:<ZSDfd.253989$wV.7201@attbi_s54>...
> "ma740988" <(E-Mail Removed)> wrote...


> > int main()
> > {
> >
> > int d(0xAFFF);
> > string value_d = toString( d );
> > cout << "value_d is [" << value_d << "]" << endl;
> >
> > string value_e( " 4999 " );
> > string value_f( " 0xAFFF " );
> >
> > int val_1 = fromString<int>( value_e );
> > cout << "val_1 is [" << val_1 << "]" << endl;
> > int val_2 = fromString<int>( value_f );

>
> Change to
>
> int val_e = fromString<int>( value_f, hex );
>
> > cout << "val_2 is [" << val_2 << "]" << std::hex << endl;
> >
> > }

>
> HTH
>
> V

Beautiful. One question though (Haven't gotten through Langer/Kreft)
oct doesn't co-operate

template<typename T>
T fromString(const std::string& s,
std::ios_base& (*f)(std::ios_base&) = std::dec)
{
std::istringstream is(s);
T t;
is >> f >> t;
return t;
}

string value_e( " 4999 " );
int val_e = fromString<int>( value_e, oct);
The output is 4.
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-27-2004
ma740988 wrote:
> [..] One question though (Haven't gotten through Langer/Kreft)
> oct doesn't co-operate
>
> template<typename T>
> T fromString(const std::string& s,
> std::ios_base& (*f)(std::ios_base&) = std::dec)
> {
> std::istringstream is(s);
> T t;
> is >> f >> t;
> return t;
> }
>
> string value_e( " 4999 " );
> int val_e = fromString<int>( value_e, oct);
> The output is 4.


'9' is not a valid input for the octal converter, is it?

V
 
Reply With Quote
 
ma740988
Guest
Posts: n/a
 
      10-27-2004
Victor Bazarov <(E-Mail Removed)> wrote in message news:<i5Ofd.7225$(E-Mail Removed)09.us.to.v erio.net>...
> ma740988 wrote:
> > [..] One question though (Haven't gotten through Langer/Kreft)
> > oct doesn't co-operate
> >
> > template<typename T>
> > T fromString(const std::string& s,
> > std::ios_base& (*f)(std::ios_base&) = std::dec)
> > {
> > std::istringstream is(s);
> > T t;
> > is >> f >> t;
> > return t;
> > }
> >
> > string value_e( " 4999 " );
> > int val_e = fromString<int>( value_e, oct);
> > The output is 4.

>
> '9' is not a valid input for the octal converter, is it?
>
> V


Ah!!! Being 'wrapped up in the stream' , I overlooked that, however it
gets interesting. First, I'm assuming that the stream modifier
std:ct is what you're referring to as the octal converter? Now i
need to grab my text for a refresher but I conclude - based on your
reply - that the conversion is predicated upon passing single digit to
the converter. IOW 4 is passed to the converter, then 9 and so on.

Now, heres a case where the 'octal converter/stream modifier(?)'
produced the desired output which refutes my prior conclusion.

int idx(4999);
cout << oct << idx << endl;
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-27-2004
ma740988 wrote:
> Victor Bazarov <(E-Mail Removed)> wrote in message news:<i5Ofd.7225$(E-Mail Removed)09.us.to.v erio.net>...
>
>>ma740988 wrote:
>>
>>>[..] One question though (Haven't gotten through Langer/Kreft)
>>>oct doesn't co-operate
>>>
>>>template<typename T>
>>>T fromString(const std::string& s,
>>> std::ios_base& (*f)(std::ios_base&) = std::dec)
>>>{
>>> std::istringstream is(s);
>>> T t;
>>> is >> f >> t;
>>> return t;
>>>}
>>>
>>>string value_e( " 4999 " );
>>>int val_e = fromString<int>( value_e, oct);
>>>The output is 4.

>>
>>'9' is not a valid input for the octal converter, is it?
>>
>>V

>
>
> Ah!!! Being 'wrapped up in the stream' , I overlooked that, however it
> gets interesting. First, I'm assuming that the stream modifier
> std:ct is what you're referring to as the octal converter? Now i
> need to grab my text for a refresher but I conclude - based on your
> reply - that the conversion is predicated upon passing single digit to
> the converter. IOW 4 is passed to the converter, then 9 and so on.
>
> Now, heres a case where the 'octal converter/stream modifier(?)'
> produced the desired output which refutes my prior conclusion.
>
> int idx(4999);
> cout << oct << idx << endl;


'oct', like 'dec' or 'hex', control how the string is converted to and
from the internal representation. Those format flags are bi-directional.

You can think of it that they turn on certain converters in the stream.
Once you say 'oct', the next string is interpreted as octal if you input
or the next number is output in the octal form if you output. Converters
are bi-directional too.

V
 
Reply With Quote
 
ma740988
Guest
Posts: n/a
 
      10-28-2004
Victor Bazarov <(E-Mail Removed)> wrote in message news:<i5Ofd.7225
>



I'm using google as a newsreader (too cheap right now) and as a result
I dont see your responses momentarily.
In any event, after seeing your use of the fuction pointer that
returns a reference to ios_base. I went back and retrofitted some
'old' code to do the same.
One things that's puzzled me in the past (string related) is the
results of the program below. The output is 0 when i expect 0x00.
0xFF, etc. works fine.


//PARAMETERIZED OVER CHARACTER AND NUMERIC TYPE TO BE CONVERTED
template <typename CT, typename T>
std::basic_string<CT> convertToStr(const T& t, std::ios_base &
(*f)(std::ios_base&), const std::streamsize precision)
{
std::basic_ostringstream<CT> oss;
oss.setf(std::ios::showbase);
oss << std::fixed << std::setprecision(precision)<< f << t;
return oss.str();
};

int main()
{
cout << convertToStr<char>(0x00, std::hex, 0) << endl;
}
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-28-2004
ma740988 wrote:
> Victor Bazarov <(E-Mail Removed)> wrote in message news:<i5Ofd.7225
>
>
>
> I'm using google as a newsreader (too cheap right now) and as a result
> I dont see your responses momentarily.
> In any event, after seeing your use of the fuction pointer that
> returns a reference to ios_base. I went back and retrofitted some
> 'old' code to do the same.
> One things that's puzzled me in the past (string related) is the
> results of the program below. The output is 0 when i expect 0x00.
> 0xFF, etc. works fine.


I am not surprised. The conversion to hex is done precisely as if it
were done by 'printf'. Since 'printf' never prepends 0 with 0x, neither
does the ostream. The C Standard says that only a non-zero value will
be prefixed with 0x. If you want _all_ values to be prefixed, you should
(a) drop the 'showbase' and (b) add "0x" for the hex.

>
>
> //PARAMETERIZED OVER CHARACTER AND NUMERIC TYPE TO BE CONVERTED
> template <typename CT, typename T>
> std::basic_string<CT> convertToStr(const T& t, std::ios_base &
> (*f)(std::ios_base&), const std::streamsize precision)
> {
> std::basic_ostringstream<CT> oss;
> oss.setf(std::ios::showbase);
> oss << std::fixed << std::setprecision(precision)<< f << t;
> return oss.str();
> };
>
> int main()
> {
> cout << convertToStr<char>(0x00, std::hex, 0) << endl;
> }



V
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
istringstream syntax error question Donald Canton C++ 1 01-30-2004 02:16 AM
istringstream??? bml C++ 3 01-27-2004 05:03 PM
istringstream question Viet Le Hong C++ 3 09-18-2003 03:34 PM
istringstream to bool Agent Mulder C++ 8 08-23-2003 11:55 PM
Allocating istringstream objects Samuele Armondi C++ 1 07-11-2003 10:22 PM



Advertisments