重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

VCのFILE処理はC言語と大きく異なっているようで戸惑っています。

serializeをオーバーライトすればいいとありました。
例えば CTestAppDoc::Serialize( CArchive& ar )
というようなメンバ関数ができます。

それで質問なんですけど、serializeを使ったファイルの読み書きは基本なんですか。
それとも、他に基本のコードがあるのでしょうか?

次にメンバ関数の利用には、そのクラスが必ずインスタンスを持つ必要があるのでしょうか。
もしあるのなら、CArchive のインスタンスはどこで作成されているのでしょう?

A 回答 (3件)

>正直いって参ってます。


>いきなりCArchiveが主題になっていまして、
>当然serializeはCArchiveのメンバ関数だと思っていたら、
>これが全然つじつまが合わないんです。
SerializeはCObjectのメンバ関数です。
CTestAppDocはCObjectを継承しているのでこれをオーバーライドしているのです。
(CTestAppDoc←CDocument←CCmdTarget←CObjectと継承しています。)

>CArchive のインスタンスはどこで作成されているのでしょう?
BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName)で作成されています。
別も私も覚えているわけではなく、Serialize内部でブレークポイントをはり
呼び出し履歴(スタック)をみればわかることです。

>本当にこんなコーディングが基本なのか??と疑問に思ったんです。
C/C++の基本ではありません。MFCは応用です。FのFoundationは基礎という意味もありますが
アプリケーションの土台という意味です。
MFCを使うメリットは開発工数を短くする事ですが、MFCを使う前に
MFCを使わない方法でWindowsアプリケーションを作成する事をお勧めします。
http://www.kumei.ne.jp/c_lang/
そうすれば、ある程度MFCの内部も見えてくると思います。
C/C++とWindowsAPIの基礎がわかっていないうちにMFCを使えば混乱するだけだと思います。

私も昔VC++をはじめるとき、はじめて買った本がMFCで解説されており
その本に書かれるままにやって時計やメモ帳などのアプリは作れたのですが
まったく応用がきかなかったという経験があります。
    • good
    • 0
この回答へのお礼

わおー、しばらく置いておいたら凄い回答が2つも。

serializeの前に別のものがよばれているんですか。
お盆休みで色々忙しかったですが、運転中とかに漠然と考えてはいました。
これで何となく整理できそうです。

呼び出し履歴なるものがあるのは知りませんでした。
今は手元に開発環境がないですが、帰ったらみてみます。

どうもありがとうございました。

お礼日時:2006/08/15 11:18

基本じゃないです。


あくまでも基本はCFileとその派生クラス。

CArchiveは上級クラスでその中でCFileのオブジェクトの作成もやってます。
Document(ATestAppDoc)の中では
Documentの保全を目的として利用されています。
それ以外の箇所(クラス)ではあまり見かけないと思います。

具体的にはファイルを開くとかのイベントが発生すると
そこから自動的に色々やってくれて、Serializeに制御が渡るわけです。

たしかにこの過程は複雑ですけど、
裏を返せばプログラマはSerializeの部分だけコードすればいいんです。

VBとかC言語ではダイアログを呼び出してファイル名を指定して
その後のOpenやらエラー処理は自分で記述していたでしょ。
MFCでSerializeを使えばそういう手間が省けるんです。

といっても自分で入出力を作成する機会も多いでしょう。
そういう場合はやはりCFileが中心です。

C++にはIfSreamとOfStreamがあるから併せてみておくといいでしょう。
    • good
    • 0
この回答へのお礼

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

そうなんですか、CArchiveってのは基本じゃなく上級なんですか。
何となく今までの疑問が氷解しました。

>MFCでSerializeを使えばそういう手間が省けるんです

この一文でもやもやが吹き飛びました。
前の方も言ってましたけどMFCって応用なんですね。

仕掛けは複雑だけど、その分しっかりとコーディングは楽になっている。
コーディングが楽になっているなんて発想全然ありませんでしたから、
もう五里霧中でした。

お礼日時:2006/08/15 11:26

質問の回答になってない感じなので怒られるかもしれませんが、



>VCのFILE処理はC言語と大きく異なっているようで戸惑っています。
という事なので、こんなのはどうでしょうか。
私いつもこれでやってます。

//"ファイル名"という名前のファイルを読み込みモードで開く
CFile fileData("ファイル名",CFile::modeRead);

char c_Buff[200];
//上で開いたファイルからデータを読み込む。
fileData.Read(c_Buff,200);

//ファイルを閉じる
fileData.Close();

データ処理だけならこれで十分です(といいつつエラー処理など色々足りませんがそこはご自分で調べてもらうということで)。んー、それにしても適当すぎ?詳しい人が見たら怒られそうですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
これは何となくいつものコーディングっぽい!

VCの勉強をしていて先週本を買ってきたばかりなんです。
やっとレッスン1が終わって2に進んだら、質問通りのファイル処理でした。

正直いって参ってます。
いきなりCArchiveが主題になっていまして、
当然serializeはCArchiveのメンバ関数だと思っていたら、
これが全然つじつまが合わないんです。

もう一度読み返したらDocのメンバ関数になっているじゃないですか。
そうしたら今度はCFileとか出てきて、いっぺんにパニックです。

なんだかあちこちに仕掛け花火があるみたいで
本当にこんなコーディングが基本なのか??と疑問に思ったんです。

お礼日時:2006/08/12 22:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!