VC++.NET 2003で、StreamWriterクラスを使用してかつ構造体単位でファイルにデータを書き込むには?

解決


masat21  2005-06-07 04:08:49  No: 57716

こんばんは、masat21です。
下記に示すコードでコンパイルをかけました。

FileStream* fs = new FileStream( "ファイル名称", FileMode::Create);

// Make StreamWriter
StreamWriter* sw = new StreamWriter(fs,
    System::Text::Encoding::GetEncoding(S"ASCII"));
sw->Write( SendFileFormat );    // Write data to file
sw->Close();        // File Close

その結果、下記に示すエラーが表示されました。

 error C2664: 'void System::IO::TextWriter::Write(System::Object __gc *)' : 1 番目の引数を 'SFILEFMT' から 'System::Object __gc *' に変換できません。
ビルトイン型または値の型から 'System::Object __gc*' へ変換するにはボックス化が必要です。

※ちなみに、SendFileFormat は構造体です。

何が原因でしょうか?ご教示願います。


シャノン  2005-06-07 08:22:15  No: 57717

MC++ ではどうだかわかりませんが、以前 C# でファイルから構造体にデータを読み込もうとしたときは結局断念し、BinaryReader で1メンバずつチマチマ読み込んで行くしかない、という結論に達した覚えがあります。


YuO  2005-06-07 10:01:57  No: 57718

StreamWriterは文字列を出力するためのクラスです。
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemiostreamwriterclasstopic.asp
StreamWriterで扱えるのは,文字列とプリミティブな型のみだと考えて下さい。

私もMC++による経験がないのですが,思うに,
シャノンさんが書かれているようにBinaryWriterを使うか,
文字列表現を用意するか,だと思います。

さらに,アンマネージの世界のオブジェクトのみを出力するのであれば,
アンマネージの世界にある<fstream>を使う事を考えてみる事もよいでしょう。


masat21  2005-06-08 19:05:06  No: 57719

masat21です。
おっしゃるとおり、構造体を使用しての書き込みはできないようです。

なぜ、構造体での書き込みを考えたかと申しますと、ファイルフォーマットが1レコード512バイトの固定長であるためです。

そこで質問です。
たとえば、512バイト未満のデータを書き込む際、余ったサイズ分をスペース
で埋めるとします。
スペースで埋めるためには、for文で余ったサイズ分書き込むしかないのでしょうか?  それとも、for文以外に余ったサイズ分を一気に書き込むメソッドなどが存在するのでしょうか?

ご教示願います。


REE  2005-06-08 19:18:10  No: 57720

512バイトのスペースで埋めた領域を用意して、
そこに転送したいデータをコピーしてから、
512バイトまとめてファイルに書き込む。
こうすれば、計算間違いで間違った幅のレコードを作ることもなくなる。


masat21  2005-06-08 21:02:52  No: 57721

回答ありがとうございます。

512バイトのchar型で宣言します。
スペースで初期化するには、
memcpy( "コピー先バッファ", " ", 512 );
で可能と思ったのですが、デバッグモードで領域を確認したところ、
1バイト分しかコピーしていないのですが、
何が間違っているのかしら・・・?

.NETは奥が深いですね!


Blue  2005-06-08 21:14:42  No: 57722

>memcpy( "コピー先バッファ", " ", 512 );
memcpyではなく
memsetです。

memset( コピー先バッファ, ' ', 512 );


masat21  2005-06-08 21:22:29  No: 57723

ありがとうございます。
無事にできました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加