连接器/ C ++的下面的函数部分,它返回一个istream *。如果我只是尝试打印它,它会显示十六进制或内存位置,因为它是一个*类型。
istream *stream = res->getBlob(1);
我试过读&用它打印出来:
string s;
while (getline(*stream, s))
cout << s << endl;
但是这会因访问冲突而崩溃。我可以打印或转换成字符串的任何其他方式吗?
getline之前的stream值:
所以它似乎对我有效。我认为如果失败则为null或0
答案 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);)。