2010-11-25 21 views
2

私は、サードパーティの型を処理するために、STD :: ostreamにオペレーター< <のための独自の実装を持っているサードパーティのコードを使用しています。 私は、この出力用にstringstreamを使用しています - のような:削除のNULL文字列::

string ToString(const thrdPartyType& structure) 
{ 
stringstream outputStream; 
outputStream<<structure; 
return outputStream.str(); 
} 
... 
string str = ToString(structure); 
... 

この構造体はNULLに設定されているポインタのメンバーが含まれています。オペレータ< <と文字列にstr()の割り当てを使用している場合、私は(GDB経由 - print str)を参照してください有数の多くがあることを「\ 000」文字、その後、私は必要な文字列データ。私は唯一の真のではなく、空のデータを取得するために、これらのNULLをトリミングすることができますどのように

P.S.正確なコードは

ありがとう... WindowsのVC++で正常に動作します。

+1

を生成します。おそらくあなたはバグレポートを提出するべきです。 –

+0

まずはoutputStreamを印刷できますか?どのプラットフォームでgdbを実行していますか?これは、印刷のポインタである場合、それらは、64ビット、あなたがより多くのゼロの文字を参照してください理由を説明する可能性が動作していないされている場合? – CashCow

答えて

2

あなたは、このようなworkoroundをお探しですか?

string ToString(const thrdPartyType& structure) 
{ 
    stringstream outputStream; 
    outputStream << structure; 

    stringstream workaround; 
    while(! outputStream.eof) { 
    char t; 
    outputStream >> t; 
    if(t != '\0') 
    workaround << t; 
    } 

    return workaround .str(); 
} 
+0

ありがとう!小さな改善 - ループの外側でchar tを定義します。 – rkellerm

1

お持ちの場合はブースト利用でき、別の値を持つ文字列内のNULLのすべてのインスタンスを置換する次のようなもの。

char buf[10] = "hello"; 
string str(buf,buf+10); 
boost::replace_all(str,boost::as_array(""),"NULL"); 
cout << str << endl; 

例えば

boost::replace_all(str,boost::as_array(""),"NULL"); 

は、サードパーティのコードが壊れているかのようにそれが聞こえる次の出力

helloNULLNULLNULLNULLNULL