自前のOPENメソッドからCArchiveを引数としてメソッドを呼ぶ – プログラミング – Home

自前のOPENメソッドからCArchi...
 
通知
すべてクリア

[解決済] 自前のOPENメソッドからCArchiveを引数としてメソッドを呼ぶ


熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

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
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

宣言に使う & は参照ですね。ポインタの親戚みたいなもんです。

で。

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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CArchiveについてMSDNで調べて見たでしょうか?

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

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

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

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

n >> *ar ;
}


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

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
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました