
VCのFILE処理はC言語と大きく異なっているようで戸惑っています。
serializeをオーバーライトすればいいとありました。
例えば CTestAppDoc::Serialize( CArchive& ar )
というようなメンバ関数ができます。
それで質問なんですけど、serializeを使ったファイルの読み書きは基本なんですか。
それとも、他に基本のコードがあるのでしょうか?
次にメンバ関数の利用には、そのクラスが必ずインスタンスを持つ必要があるのでしょうか。
もしあるのなら、CArchive のインスタンスはどこで作成されているのでしょう?
No.2ベストアンサー
- 回答日時:
>正直いって参ってます。
>いきなり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で解説されており
その本に書かれるままにやって時計やメモ帳などのアプリは作れたのですが
まったく応用がきかなかったという経験があります。
わおー、しばらく置いておいたら凄い回答が2つも。
serializeの前に別のものがよばれているんですか。
お盆休みで色々忙しかったですが、運転中とかに漠然と考えてはいました。
これで何となく整理できそうです。
呼び出し履歴なるものがあるのは知りませんでした。
今は手元に開発環境がないですが、帰ったらみてみます。
どうもありがとうございました。
No.3
- 回答日時:
基本じゃないです。
あくまでも基本はCFileとその派生クラス。
CArchiveは上級クラスでその中でCFileのオブジェクトの作成もやってます。
Document(ATestAppDoc)の中では
Documentの保全を目的として利用されています。
それ以外の箇所(クラス)ではあまり見かけないと思います。
具体的にはファイルを開くとかのイベントが発生すると
そこから自動的に色々やってくれて、Serializeに制御が渡るわけです。
たしかにこの過程は複雑ですけど、
裏を返せばプログラマはSerializeの部分だけコードすればいいんです。
VBとかC言語ではダイアログを呼び出してファイル名を指定して
その後のOpenやらエラー処理は自分で記述していたでしょ。
MFCでSerializeを使えばそういう手間が省けるんです。
といっても自分で入出力を作成する機会も多いでしょう。
そういう場合はやはりCFileが中心です。
C++にはIfSreamとOfStreamがあるから併せてみておくといいでしょう。
回答ありがとうございます。
そうなんですか、CArchiveってのは基本じゃなく上級なんですか。
何となく今までの疑問が氷解しました。
>MFCでSerializeを使えばそういう手間が省けるんです
この一文でもやもやが吹き飛びました。
前の方も言ってましたけどMFCって応用なんですね。
仕掛けは複雑だけど、その分しっかりとコーディングは楽になっている。
コーディングが楽になっているなんて発想全然ありませんでしたから、
もう五里霧中でした。
No.1
- 回答日時:
質問の回答になってない感じなので怒られるかもしれませんが、
>VCのFILE処理はC言語と大きく異なっているようで戸惑っています。
という事なので、こんなのはどうでしょうか。
私いつもこれでやってます。
//"ファイル名"という名前のファイルを読み込みモードで開く
CFile fileData("ファイル名",CFile::modeRead);
char c_Buff[200];
//上で開いたファイルからデータを読み込む。
fileData.Read(c_Buff,200);
//ファイルを閉じる
fileData.Close();
データ処理だけならこれで十分です(といいつつエラー処理など色々足りませんがそこはご自分で調べてもらうということで)。んー、それにしても適当すぎ?詳しい人が見たら怒られそうですね。
回答ありがとうございます。
これは何となくいつものコーディングっぽい!
VCの勉強をしていて先週本を買ってきたばかりなんです。
やっとレッスン1が終わって2に進んだら、質問通りのファイル処理でした。
正直いって参ってます。
いきなりCArchiveが主題になっていまして、
当然serializeはCArchiveのメンバ関数だと思っていたら、
これが全然つじつまが合わないんです。
もう一度読み返したらDocのメンバ関数になっているじゃないですか。
そうしたら今度はCFileとか出てきて、いっぺんにパニックです。
なんだかあちこちに仕掛け花火があるみたいで
本当にこんなコーディングが基本なのか??と疑問に思ったんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ASPX(C#)で別ファイルで自分で...
-
インスタンス参照でアクセスで...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
C#において、同じインスタンス...
-
C#の構造体の開放のしかた
-
Systemクラスはインスタンスが...
-
VB.NET getとsetの概念がわかり...
-
変数名の付け方
-
外部ライブラリの動的参照によ...
-
VB6.0のクラスで、自分自身のイ...
-
文字列を日付に変換でParseExce...
-
ヒグマを撃退
-
「タイプ初期化子が例外をスロ...
-
JSPで<SELECT>の中にDBから持っ...
-
VB.NETでフォーム上にExcelのよ...
-
Excelで =EMBED("Acrobat Docu...
-
命名規約は連番でいいのか?
-
Excel : OpenTextメソッドが正...
-
ウィンドウを最前面にできません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
C#において、同じインスタンス...
-
C# インスタンスの破棄
-
オブジェクト参照がオブジェク...
-
VB.NET getとsetの概念がわかり...
-
「インスタンス」の意味をわか...
-
フォームの存在をチェックする方法
-
生成したインスタンスを削除す...
-
変数の参照でエラーが出てしま...
-
文字列を日付に変換でParseExce...
-
javaのクラスの作り方、エラー...
-
newしないインスタンス?実体化...
-
インスタンスを同じ名前で作成...
-
VB6.0で、DLLを動的に参照したい
-
データベースから日付型を取得...
-
C#のメモリ解放についてご教授...
-
SQLを連続発行する時の正しい(?...
おすすめ情報