开发者

How to use basic_istream when you have a std::string

开发者 https://www.devze.com 2023-02-03 17:08 出处:网络
I have a function that uses basic_istream as an argument, and I have a std::string with the data I need to开发者_如何学运维 pass it. How do I do that?You can put the string data into a stream:

I have a function that uses basic_istream as an argument, and I have a std::string with the data I need to开发者_如何学运维 pass it. How do I do that?


You can put the string data into a stream:

std::string x;
std::stringstream ss(x); // put string into stream

function_taking_stream(ss);


A full working example showing how to parse a json string using boost property_tree:

#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
using boost::property_tree::ptree;

int main ()
{
  std::string jsonString ("{ \"my key\": \"my value\" }");
  ptree pt;
  std::stringstream ss(jsonString);
  read_json(ss, pt);
  std::cout << pt.get<std::string>("my key") << std::endl;
  return 0;
}


I have a function that uses basic_istream as an argument...

So I'm assuming you have a function that accepts a variable of a type specialized from the basic_istream template.

...and I have a std::string with the data I need to pass it.

So I'm assuming you want to feed this data into the istream argument.

How do I do that?

You don't. You can't feed output to an input stream!


I think the OP means he has a basic_istream<E> to read from and wants to read to a std::string, not to a std::basic_string<E>.

You should probably write to the basic_string first then convert that to a std::string. If you want to ensure the conversion is correct you probably want a proper UTF-8 to UTF-16 converter.

If you know you are dealing with only ASCII bytes you can do something like:

std::basic_string<E> strTemp;
is >> strTemp;
std::string str( strTemp.begin(), strTemp.end() );

If you have a basic_ostream<E> you can similarly first construct a basic_string<E> from your std::string and then write that to the stream.

You can "specialise" your template function so that if E happens to be char the conversion is quick. For that purpose you can input the two strings as non-const references and the specialised version could just "swap".

0

精彩评论

暂无评论...
验证码 换一张
取 消