如何将istream *转换为字符串或只打印它?

时间:2013-09-05 00:34:02

标签: c++ pointers mysql-connector istream

连接器/ C ++的下面的函数部分,它返回一个istream *。如果我只是尝试打印它,它会显示十六进制或内存位置,因为它是一个*类型。

istream *stream = res->getBlob(1);

我试过读&用它打印出来:

    string s; 
    while (getline(*stream, s))
    cout << s << endl; 

但是这会因访问冲突而崩溃。我可以打印或转换成字符串的任何其他方式吗?

getline之前的stream值:

  • stream 0x005f3e88 {_Chcount = 26806164129143632} std :: basic_istream&gt; *

所以它似乎对我有效。我认为如果失败则为null或0

2 个答案:

答案 0 :(得分:8)

您可以使用其流缓冲区提取并打印std::istream

std::cout << in->rdbuf();

当然,这将消耗输入,您可能无法再次获取它。如果您想保留内容,可以将其写为std::ostringstream,然后使用str()方法打印内容。或者,您也可以直接从流中构造std::string,例如:

std::string content{ std::istreambuf_iterator<char>(*in),
                     std::istreambuf_iterator<char>() };

BTW,当你打印流指针时,你实际上使用了void const*的输出操作符:它打印指针所指的地址。在C ++ 03中,你甚至可以通过使用void*读取std::istream来恢复相应打印的指针:只要指向的对象没有被删除,你就可以得到指针!但是,在C ++ 11中,禁止指针隐藏,以支持将来可能添加或不添加到语言中的可选垃圾收集。但是,关于非隐藏指针的保证也有助于成员调试器。

答案 1 :(得分:1)

您可以在while循环中使用std :: getline函数来显示istream中的数据。这是我运行的一个例子,它运行正常:

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

int main()
{

 std::stringstream s1("This is a test string\nWith two lines");
 std::istream s2(s1.rdbuf()); //just creates the istream to start with 

 std::string stt; 
 while(std::getline(s2,stt)) //can also have delimiter in getline 
 {                           
   std::cout<<stt<<std::endl;  
 }

 return 0;
}

运行它并显示:

This is a test string
With two lines

我也试过这个,以便我像你一样使用指向istream的指针:

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

int main()
{
  std::stringstream s1("This is a test string\nWith three lines);
  std::istream s2(s1.rdbuf()); //just creates istream to start with 
  std::istream *s3 = &s2; //and use a pointer to istream like code at top

  std::string stt;
  while(std::getline(*s3,stt,'\n')) 
  {                          
    std::cout<<stt<<std::endl; //result.  
  }

  return 0;
}

这段代码运行并给出了与我没有使用指针的结果相同的结果。我无法重现您的错误。所以这个问题看起来像你的istream的创建(例如istream * stream = res-&gt; getBlob(1);)。