8

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

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

我试着用这个来阅读和打印它:

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

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

getline 之前的流值:

  • 流 0x005f3e88 {_Chcount=26806164129143632 } std::basic_istream > *

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

4

2 回答 2

13

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

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

当然,这会消耗输入,您可能无法再次获得它。如果要保留内容,可以std::ostringstream改为编写并使用该str()方法打印内容。或者,您也可以直接std::string从流中构造 a,例如:

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

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

于 2013-09-05T00:59:18.930 回答
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->getBlob(1);)。

于 2016-06-26T04:12:18.033 回答