NULL文字を抜いてデータコピーを行うには?

解決


masat21  2005-06-08 17:21:42  No: 57773  IP: 192.*.*.*

VC++ .NETのStreamWriter()でデータ書き込み処理を作成したところ、
途中のNULL文字のところまでしかデータをコピーしません。

NULL文字を入れないでデータ書き込みを行う方法についてご教示願います。

編集 削除
YuO  2005-06-08 20:38:16  No: 57774  IP: 192.*.*.*

特別問題なく書き込めましたが。

---- test.cpp ----
#using <mscorlib.dll>

using namespace System;
using namespace System::IO;
using namespace System::Text;

int main (void)
{
    String __gc * s = S"テスト\0文字列";
    StreamWriter __gc * sw = new StreamWriter(S"test.dat", false, Encoding::Unicode);
    sw->WriteLine(s);
    sw->Close();
    return 0;
}

---- 実行結果 (test.dat) ----
00000000 FF FE C6 30 B9 30 C8 30-00 00 87 65 57 5B 17 52
00000010 0D 00 0A 00                                    


ちゃんと8バイト目からの2バイトが,U+0000になっています。

編集 削除
PATIO  2005-06-09 17:08:34  No: 57775  IP: 192.*.*.*

単に確認方法が拙いだけなのでは?

普通に読み込んでデバッガで見ただけだと多分最初の'\0'までしか
表示されないと思います。

編集 削除
masat21  2005-06-10 12:55:20  No: 57776  IP: 192.*.*.*

masat21です。
回答ありがとうございます。
こちらからいくつか質問します。

1.YuOさんへ
  StreamWriterの第2引数をtrueにし、第3引数をアスキーにしてみても
  同様でしょうか?

2.PATIOさんへ
  ファイルに出力した後、MIFES(バイナリエディタ)で確認しました。
  '\0'までしか表示されません。

以上

編集 削除
masat21  2005-06-10 13:10:49  No: 57777  IP: 192.*.*.*

現在、BinaryWriter()を使用して1メンバずつファイルに書き込む処理の実装を行っています。
ところが、単体で確認したところ、例に示すようにファイルに書き出します。

(バイナリファイルの出力結果)
000000   08 42 58 58 58 31 54 20  20 04 4D 30 30 32 01 31
000010   0E 30 36 30 33 32 30 30  35 30 30 30 30 30 30

00番地、09番地、0E番地および10番地に、各メンバのサイズが格納されます。このサイズを出力しない方法についてご教示願います。

P.S.
.NETは奥が深い!
バイナリデータのコピぺってここではできないのかしら・・・。

編集 削除
YuO  2005-06-15 16:02:01  No: 57778  IP: 192.*.*.*

>   StreamWriterの第2引数をtrueにし、第3引数をアスキーにしてみても
>   同様でしょうか?

やってみてわかることを,何故尋ねるのでしょうか。

ちなみに,ちゃんと出力されますよ。


> 00番地、09番地、0E番地および10番地に、各メンバのサイズが格納されます。このサイズを出力しない方法についてご教示願います。

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200506/05060042.txt


> バイナリデータのコピぺってここではできないのかしら・・・。

コピペされたところでコントロールコードは見ることができないので無意味です。

編集 削除
masat21  2005-06-16 09:09:23  No: 57779  IP: 192.*.*.*

Encodingクラスでバイト配列に変換して,自分で書き込んだところ、
文字長プリフィックスを除いた状態で書き込みが無事にできました。

解決のチェック入れるのを忘れていました。
お騒がせいたしました。

編集 削除