8

以下のコネクタ/C++ の関数部分は、istream* を返します。印刷しようとすると、 * タイプであるため、16進数またはメモリ位置が表示されます。

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ストリーム バッファを使用して、 を抽出して出力できます。

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

もちろん、これは入力を消費し、再度取得できない場合があります。コンテンツを保持したい場合は、代わりにそれを記述し、メソッドstd::ostringstreamを使用してコンテンツを印刷できます。または、ストリームから astr()を直接構築することもできます。たとえば、次のようになります。std::string

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

ところで、ストリーム ポインタを出力したときに、実際には出力演算子を使用しましたvoid const*。これは、ポインタが参照しているアドレスを出力します。C++03 では、 : をvoid*使用してa を読み取ることにより、対応する出力されたポインターを復元することさえできました。std::istreamただし、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 に答える