こんばんは、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 は構造体です。
何が原因でしょうか?ご教示願います。
MC++ ではどうだかわかりませんが、以前 C# でファイルから構造体にデータを読み込もうとしたときは結局断念し、BinaryReader で1メンバずつチマチマ読み込んで行くしかない、という結論に達した覚えがあります。
StreamWriterは文字列を出力するためのクラスです。
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemiostreamwriterclasstopic.asp
StreamWriterで扱えるのは,文字列とプリミティブな型のみだと考えて下さい。
私もMC++による経験がないのですが,思うに,
シャノンさんが書かれているようにBinaryWriterを使うか,
文字列表現を用意するか,だと思います。
さらに,アンマネージの世界のオブジェクトのみを出力するのであれば,
アンマネージの世界にある<fstream>を使う事を考えてみる事もよいでしょう。
masat21です。
おっしゃるとおり、構造体を使用しての書き込みはできないようです。
なぜ、構造体での書き込みを考えたかと申しますと、ファイルフォーマットが1レコード512バイトの固定長であるためです。
そこで質問です。
たとえば、512バイト未満のデータを書き込む際、余ったサイズ分をスペース
で埋めるとします。
スペースで埋めるためには、for文で余ったサイズ分書き込むしかないのでしょうか? それとも、for文以外に余ったサイズ分を一気に書き込むメソッドなどが存在するのでしょうか?
ご教示願います。
512バイトのスペースで埋めた領域を用意して、
そこに転送したいデータをコピーしてから、
512バイトまとめてファイルに書き込む。
こうすれば、計算間違いで間違った幅のレコードを作ることもなくなる。
回答ありがとうございます。
512バイトのchar型で宣言します。
スペースで初期化するには、
memcpy( "コピー先バッファ", " ", 512 );
で可能と思ったのですが、デバッグモードで領域を確認したところ、
1バイト分しかコピーしていないのですが、
何が間違っているのかしら・・・?
.NETは奥が深いですね!
>memcpy( "コピー先バッファ", " ", 512 );
memcpyではなく
memsetです。
memset( コピー先バッファ, ' ', 512 );
ありがとうございます。
無事にできました。
ツイート | ![]() |