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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
[VBS]変数を定数に変換する方法...
-
エラーの意味は? Lvalue req...
-
C言語 アロー演算子について質...
-
C言語 列挙型(enum型)変数について
-
整数xxxが大き過ぎますというエ...
-
サブwindowをオープンして外部...
-
Excel VBAでイコール二回使えま...
-
テキストファイルの値をバッチ...
-
EXCEL/VBA 変数の値をクリップ...
-
DataTableの値を変数に代入したい
-
verilog HDLの[=]と[<=]の使い分け
-
C言語 exitで終了した関数の戻...
-
i++と++i ってどう違うのですか?
-
コマンドプロンプト バッチ|結...
-
jsp~jspにhiddenを使って変数...
-
複数の演算子を選択する場合の処理
-
VB6.0 DataGridでのfirstRowの...
-
VBA 1行で複数の代入を行った...
-
C言語 exitの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
EXCEL/VBA 変数の値をクリップ...
-
整数xxxが大き過ぎますというエ...
-
テキストボックスの値を変数に...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
jsp~jspにhiddenを使って変数...
-
processing エラーで、 "cannot...
-
python の 連鎖代入の文法
-
i++と++i ってどう違うのですか?
-
プログラミングで変数と関数の...
-
C言語 アロー演算子について質...
-
「%」を使って、偶数か奇数かを...
-
JavaScriptをURLから直接実行し...
-
VBA 1行で複数の代入を行った...
-
ExcelのVBAでをA列に第0〜19項...
-
無名関数のメリットがよくわか...
-
コマンドプロンプト バッチ|結...
おすすめ情報