こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Serialize(CArchive& ar)にて

VC2008のMFC:SDIにて作成しております。
以下入力画面を作成しました。

<入力画面>
氏名     エディットボックス(DDX変数:m_Name)
郵便番号  エディットボックス(DDX変数:m_Yubin)
住所     エディットボックス(DDX変数:m_Jusho)

として画面を作りました。

<シリアライズ関数にて>
void CP208_JushoDoc::Serialize(CArchive& ar)
{
//ビューのポインタを取得します。
POSITION pos = GetFirstViewPosition();
CJushoView *pView = (CJushoView*)GetNextView(pos);

if (ar.IsStoring())
{
// TODO: 格納するコードをここに追加してください。

//エディットボックスに入力された値を取得する。
pView->UpdateData(TRUE);

//メンバ変数の値をファイルに書き込み
ar << pView->m_Name;
ar << pView->m_Yubin;
ar << pView->m_Jusho;
}
else
{
// TODO: 読み込むコードをここに追加してください。

//ファイルからメンバ変数に読み込み
ar >> pView->m_Name;
ar >> pView->m_Yubin;
ar >> pView->m_Jusho;

//エディットボックスに値を表示する
pView->UpdateData(FALSE);
}
}
======↑コードココまで。
のコードを実装しております。

<質問>
各エディットボックスに、簡単な値を入力し「名前を付けて保存」しました。

・入力内容
氏名:eeee
郵便番号:rrr
住所:fff

出力されたファイル(test.txt)を確認したところ、
「 eeee rrr fff」
とスペースらしきものが含まれた形で保存されていました。
書き込み時は、「arのメンバ変数にでも追記されて最終的な結果が出力されたかな」の認識でいます。

ただ、「メニューバーのファイルを開く」を選択して「test.txt」を読み込んでみたところ正しく表示されました。(メニューバーのコード等は一切触っておりません。)

・結果
氏名:eeee
郵便番号:rrr
住所:fff

このように読み込まれたのです。なぜ 
「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」
というのが知りたいのです。(m_Yubin、m_Jushoも正しく代入されているため問題なく表示できています。)

csvみたいに、半角スペースで区切ってるのかと思い、
「氏名:aaaa▲bbbb」と、入力し保存後、ファイルを読み込んでみましたが、
正しく「氏名:aaaa▲bbbb」と表示されました。(▲は半角スペース)

一体、どういう理屈で、「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」
動いているのでしょうか?
arに、文字列が格納される仕組みがわかれば解決するかなと思っているのですが、
http://msdn.microsoft.com/ja-jp/library/dz8k76ze
ココを参考にしたのですが、気になってる部分はわかりませんでした。

どなたかご教授よろしくお願いします。

投稿日時 - 2012-09-03 14:30:54

QNo.7678369

困ってます

質問者が選んだベストアンサー

うーん、本当に半角スペースで区切られているのかは疑問。
もしそうなら m_Name 等にスペース入力した時正しく処理できないはず!
テキストファイルを編集して表示できたとしても、それはたまたまかも?

区切りが何であるのかはテキストエディタではなく、バイナリエディタで確認する必要がある。

そもそも、なんでそんなことを知りたいの?
> なぜ 
> 「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」
> というのが知りたいのです。(m_Yubin、m_Jushoも正しく代入されているため問題なく表示できています。)
という疑問についての答えは、「CArchive に保存/読み出しをする時のルールをm_Nameの変数型である(多分)CString が
決めているので 保存/読み出しでちゃんと辻褄があるように処理している」から。
CStringが実際にどう処理しているかを分かった所で、何をやりたいの?
デバッグの為に調査することは意味があるかも知れないが、自分か作成していないクラスの処理の詳細は、一般的には知るべきではないと思うし、知る必要もないと思う(そうでないとカプセル化に反する)。

投稿日時 - 2012-09-03 17:03:54

お礼

>「CArchive に保存/読み出しをする時のルールをm_Nameの変数型である(多分)CString が
決めているので 保存/読み出しでちゃんと辻褄があるように処理している」から。

やはり、そういう仕様なのですね。

気になった理由としては、

【m_Nameで受けとった値が、ファイル保存後読み出したときに、「m_Yubin」に入ったりすることがないのか?】
と疑問に思ったからです。

もし、そんなことが起こった場合、
「そこの仕様がわからないと、何が原因で、m_Yubinに入ったのか。」
に対応できなくなるかな。と思ったのです。

ただ、教えて頂いた仕様なら、気にする必要はないかなと思いました。
情報ありがとうございました。すっきりしました。

投稿日時 - 2012-09-06 15:43:13

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問