MFC VC++ 6.0 XP
Serialize(CArchive& ar)内から呼べるようにファイル読み込み関数をCArchive& arを引
数としてつくったんですが、自前のOPENメソッドからこのCArchive& arを引数とす
る関数を呼びたいのですがどうしたらよろしいでしょうか?(そんなことができるのか
どうかもわかりません)
<xxxDoc.cpp>
void xxxDoc::OwnRead(CArchive& ar)
{
ar >> m_Number ;
}
<xxxView.cpp>
void xxxView::OwnOpen()
{
CFileDialog fdxxx (
TRUE,
.xxx,
Untitled.xxx,
OFN_CREATEPROMPT,
xxxx Files *.xxx | *.xxx,
NULL) ;
if (fdP2g.DoModal() == IDOK) {
xxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//ここでCArciveを渡したいのですがファイル情報をCArcive にど
うやってするのかわかりません。
pDoc->OwnRead(???);
}
}
>void xxxDoc::OwnRead(CArchive& ar)
私が知識不足で正しいのかも知れませんが、このように宣言するのは
意図して正しいのでしょうか
実は
void xxxDoc::OwnRead(CArchive* ar)
としたかったんじゃないの?
前記は関数として実際に実行する部分には使うけど、宣言にはあまり使わない
ような気がします
宣言に使う & は参照ですね。ポインタの親戚みたいなもんです。
で。
CFileDialog からファイル名を取得し
http://msdn.microsoft.com/ja-jp/library/5b9c3c1f.aspx
そこから CFile オブジェクトを作って
http://msdn.microsoft.com/ja-jp/library/cz0a83sb.aspx
さらに CArchive オブジェクトを作って
http://msdn.microsoft.com/ja-jp/library/e031sa8s.aspx
渡せばよいんではないかと。
CArchiveについてMSDNで調べて見たでしょうか?
シリアル化 : オブジェクトのシリアル化
という表題でCArchiveの使い方に関しての説明があると思います。
あと、調べて見たけれどわからないと言う話であれば、
どの辺りが分からないのかを整理して自己分析してみてください。
案外、これをやると芋づる式にわかったりする事があります。
ちなみにVC++6.0を使っているのであれば、
VC++6.0に付属のMSDN(ローカルのHELP)を使った方が良いかもしれません。
VC++6.0はかなり古い環境なので最新のMSDNだと内容があわない事もあると思います。
wood さん、レスありがとうございます。
OwnRead(CArchive& ar)は、意図して書いています。
というよりも自動生成されるSerialize()
がCArchive& arと受けているので、コピーしているだけです。
wood さんのいうとおり、以下のようなコーディングをすると、
コンパイルエラー
> error C2678: 二項演算子 '>>' : 型 'int' の左オペランドを扱う演算子は定義されてい
> ません。(または変換できません)(新しい動作; ヘルプを参照)
というエラーが出力されます。
void CTest3Doc::WriteFile(CArchive *ar)
{
int n = 300 ;
n >> *ar ;
}
aetosさん、PATIOさん、レスありがとうございました。
PATIOさん、みなさんから、ヘルプを読むように指導していただいているのです
が、なにぶん力不足で、読めない(理解できないことが)よくあります。
こうして、コーディングができてから、読むと、「こういうことが書いてあったの
か・・・」とか思うんですが、最初に自分で読んでいるとなにを書いてあるのかよくわ
かりませんでした。いつも、いろいろご指導ありがとうございます。
void CTest3View::OnOwnOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog fdC (
FALSE,
.cpp,
Untitled.cpp,
OFN_OVERWRITEPROMPT,
c++ source file *.cpp | *.cpp,
NULL) ;
if (fdC.DoModal() == IDOK) {
CTest3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString szCppFileName = fdC.GetPathName() ;
CFile flC(szCppFileName,CFile::modeCreate |
CFile::modeWrite) ;
CArchive arC (&flC,CArchive::store) ;
pDoc->WriteCppFile(arC) ;
}
}
void CTest3Doc::WriteCppFile(CArchive &ar)
{
CString szFileHeader(#include \stdafx.h\\n) ;
ar.Write(szFileHeader,szFileHeader.GetLength()) ;
}
ちなみに…
CArchive を使って書き込むと、ファイルの内容は思い通りにはできません。
CString を書き込んだ場合、勝手に文字列長などのバイナリデータが書き込まれ、純粋
な文字列データだけにはなりませんのでご注意。
ファイルの内容を完全にコントロールしたい場合は CArchive は使うべきではありませ
ん。CFile なり何なりでチマチマ書き込みましょう。
CArchive で書き込むのは、CArchive で読み取る場合だけにすべきです。