自前のOPENメソッドからCArchiveを引数としてメソッドを呼ぶ

[戻る]
熱血 2009/08/10(月) 18:56:29
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(???);
         }
}

wood 2009/08/11(火) 05:35:08
>void xxxDoc::OwnRead(CArchive& ar)
私が知識不足で正しいのかも知れませんが、このように宣言するのは
意図して正しいのでしょうか

実は
void xxxDoc::OwnRead(CArchive* ar)
としたかったんじゃないの?

前記は関数として実際に実行する部分には使うけど、宣言にはあまり使わない
ような気がします

aetos 2009/08/11(火) 10:02:48
宣言に使う & は参照ですね。ポインタの親戚みたいなもんです。

で。

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

渡せばよいんではないかと。

PATIO 2009/08/11(火) 10:06:19
CArchiveについてMSDNで調べて見たでしょうか?

シリアル化 : オブジェクトのシリアル化
という表題でCArchiveの使い方に関しての説明があると思います。

あと、調べて見たけれどわからないと言う話であれば、
どの辺りが分からないのかを整理して自己分析してみてください。
案外、これをやると芋づる式にわかったりする事があります。

PATIO 2009/08/11(火) 10:18:54
ちなみにVC++6.0を使っているのであれば、
VC++6.0に付属のMSDN(ローカルのHELP)を使った方が良いかもしれません。
VC++6.0はかなり古い環境なので最新のMSDNだと内容があわない事もあると思います。

熱血 2009/08/11(火) 22:12:29
wood さん、レスありがとうございます。
OwnRead(CArchive& ar)は、意図して書いています。
というよりも自動生成されるSerialize()
がCArchive& arと受けているので、コピーしているだけです。

wood さんのいうとおり、以下のようなコーディングをすると、
コンパイルエラー 
> error C2678: 二項演算子 '>>' : 型 'int' の左オペランドを扱う演算子は定義されてい
> ません。(または変換できません)(新しい動作; ヘルプを参照)
というエラーが出力されます。

void CTest3Doc::WriteFile(CArchive *ar)
{
    int    n = 300 ;

    n >> *ar ;
}

熱血 2009/08/12(水) 05:22:19
[[解決]]
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()) ;
}

aetos 2009/08/12(水) 09:43:20
ちなみに…
CArchive を使って書き込むと、ファイルの内容は思い通りにはできません。
CString を書き込んだ場合、勝手に文字列長などのバイナリデータが書き込まれ、純粋
な文字列データだけにはなりませんのでご注意。
ファイルの内容を完全にコントロールしたい場合は CArchive は使うべきではありませ
ん。CFile なり何なりでチマチマ書き込みましょう。
CArchive で書き込むのは、CArchive で読み取る場合だけにすべきです。

古いスレッドには追加発言できません。