std :: stringstream для возврата char * - PullRequest
0 голосов
/ 23 января 2020

Это мой код:

#include <iostream>
#include <sstream>
void serialize(std::ostream& os)
{
   int r1 = 10;
   int r2 = 12;
   os.write(reinterpret_cast<char const*>(&r1), sizeof(r1));
   os.write(reinterpret_cast<char const*>(&r2), sizeof(r2));
}
int main()
{
   std::stringstream ss;
   serialize(ss);
   std::cout<<" Buffer length : " << ss.str().length() <<'\n'; //This print correct length
   const char *ptrToBuff = ss.str().c_str();// HERE is the problem. char * does not contain anything.   
   std::cout <<ptrToBuff; // NOTHING is printed
}

Как получить указатель на символ в буфере потока? Проблема в std::cout << ptrToBuff; does not print anything

1 Ответ

2 голосов
/ 23 января 2020

Указатель на поток оставит висячий указатель, однако вы можете скопировать строку:

const std::string s = ss.str(); 

И затем указать на нее const char*:

const char *ptrToBuff = s.c_str();

В ваша serialize функция, вы должны использовать оператор << для записи в ostream:

os << r1 << " " << sizeof(r1) << std::endl;
os << r2 << " " << sizeof(r2) << std::endl;

Таким образом, весь код будет: ( см. здесь )

void serialize(std::ostream& os)
{
   int r1 = 10;
   int r2 = 12;
   os << r1 << " " << sizeof(r1) << std::endl;
   os << r2 << " " << sizeof(r2) << std::endl;
}
int main()
{
   std::stringstream ss;
   serialize(ss);  
   std::cout<<"Buffer length : " << ss.str().length() <<'\n';
   const std::string s = ss.str(); 
   const char *ptrToBuff = s.c_str();
   std::cout << ptrToBuff; 
}
...