
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 …
ココを参考にしたのですが、気になってる部分はわかりませんでした。
どなたかご教授よろしくお願いします。

No.1ベストアンサー
- 回答日時:
うーん、本当に半角スペースで区切られているのかは疑問。
もしそうなら m_Name 等にスペース入力した時正しく処理できないはず!
テキストファイルを編集して表示できたとしても、それはたまたまかも?
区切りが何であるのかはテキストエディタではなく、バイナリエディタで確認する必要がある。
そもそも、なんでそんなことを知りたいの?
> なぜ
> 「eeeeまでが一区切りとコンピューターが判断し、m_Nameに代入できたのか?」
> というのが知りたいのです。(m_Yubin、m_Jushoも正しく代入されているため問題なく表示できています。)
という疑問についての答えは、「CArchive に保存/読み出しをする時のルールをm_Nameの変数型である(多分)CString が
決めているので 保存/読み出しでちゃんと辻褄があるように処理している」から。
CStringが実際にどう処理しているかを分かった所で、何をやりたいの?
デバッグの為に調査することは意味があるかも知れないが、自分か作成していないクラスの処理の詳細は、一般的には知るべきではないと思うし、知る必要もないと思う(そうでないとカプセル化に反する)。
>「CArchive に保存/読み出しをする時のルールをm_Nameの変数型である(多分)CString が
決めているので 保存/読み出しでちゃんと辻褄があるように処理している」から。
やはり、そういう仕様なのですね。
気になった理由としては、
【m_Nameで受けとった値が、ファイル保存後読み出したときに、「m_Yubin」に入ったりすることがないのか?】
と疑問に思ったからです。
もし、そんなことが起こった場合、
「そこの仕様がわからないと、何が原因で、m_Yubinに入ったのか。」
に対応できなくなるかな。と思ったのです。
ただ、教えて頂いた仕様なら、気にする必要はないかなと思いました。
情報ありがとうございました。すっきりしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jsp~jspにhiddenを使って変数...
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
[VBS]変数を定数に変換する方法...
-
processing エラーで、 "cannot...
-
テキストボックスの値を変数に...
-
Variant型で宣言してるのにEmpt...
-
DataTableの値を変数に代入したい
-
stdpicture型の変数に、、
-
整数xxxが大き過ぎますというエ...
-
C言語 アロー演算子について質...
-
プログラミングで変数と関数の...
-
変数にオフセットが付いている...
-
Accessコンボボックスにレコー...
-
EXCEL/VBA 変数の値をクリップ...
-
COBOLの変数
-
Borland C++ Compiler 5.5の警...
-
条件演算子 ? :
-
VBAでコマンドプロンプトの結果...
-
i++と++i ってどう違うのですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
-
EXCEL/VBA 変数の値をクリップ...
-
テキストボックスの値を変数に...
-
C言語 アロー演算子について質...
-
整数xxxが大き過ぎますというエ...
-
[VBS]変数を定数に変換する方法...
-
processing エラーで、 "cannot...
-
gridViewの行選択解除
-
Variant型で宣言してるのにEmpt...
-
プログラミングで変数と関数の...
-
C言語
-
DataTableの値を変数に代入したい
-
VB6.0 DataGridでのfirstRowの...
-
DataColumn型の使用方法
-
String型ローカル変数の初期化...
-
VBA 1行で複数の代入を行った...
-
変数宣言と初期値代入の場所に...
-
valueChanged の引数について
おすすめ情報