MFC VC2008のSerialize関数についての質問

このQ&Aのポイント
  • 「Serialize(CArchive& ar)」関数についての質問です。質問者がVC2008のMFC:SDIで作成したプログラムで、入力画面を作成し、Serialize関数内でファイルの読み書きを行っています。しかし、書き込み時にスペースが含まれた形で保存され、読み込み時には正しく表示されるという現象が発生しています。質問者は、なぜスペースまでが一区切りとして判断され、m_Nameに代入されるのか疑問に思っています。
  • 質問者は、csvのように半角スペースで区切って保存されているのではないかと考え、テストとして「氏名:aaaa▲bbbb」と入力し保存したところ、正しく表示されたと述べています。質問者は、どのような仕組みで「eeeeまでが一区切りとして判断され、m_Nameに代入されるのか」を知りたいとしています。
  • 参考情報として、質問者は「http://msdn.microsoft.com/ja-jp/library/dz8k76ze」を参照したが、疑問点についてはわからなかったと述べています。質問者は、どなたかご教授いただけると幸いとしています。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
回答No.1

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

ShiftTail
質問者

お礼

>「CArchive に保存/読み出しをする時のルールをm_Nameの変数型である(多分)CString が 決めているので 保存/読み出しでちゃんと辻褄があるように処理している」から。 やはり、そういう仕様なのですね。 気になった理由としては、 【m_Nameで受けとった値が、ファイル保存後読み出したときに、「m_Yubin」に入ったりすることがないのか?】 と疑問に思ったからです。 もし、そんなことが起こった場合、 「そこの仕様がわからないと、何が原因で、m_Yubinに入ったのか。」 に対応できなくなるかな。と思ったのです。 ただ、教えて頂いた仕様なら、気にする必要はないかなと思いました。 情報ありがとうございました。すっきりしました。

関連するQ&A

  • 入力チェック

    下記の入力チェックのときに「【選択して下さい】」という文字列なら「だめ」と表示したいのですが、項目が多いのでヘッダー部分でdocument.kansou.yubin.valueのようのようにテキストボックスの名称を1個ずつ指定せずに一括でできないでしょうか。イメージとしてはdocument.kansou.form(i).valueみたいな?感じのまとめ処理がしたいのですが。 現在→yubinが「【選択して下さい】」ならダメ jusho1が「【選択して下さい】」ならダメ ・・・・ やりたいこと→どれかのテキストボックスが「【選択して下さい】なら「だめ」 <HTML> <HEAD> <TITLE>入力チェック</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- function submitCheck(){ if (document.kansou.yubin.value=="【選択して下さい】"){ alert("だめ"); return false; } else return true; } //--> </SCRIPT> </HEAD> <BODY> <FORM NAME="kansou" ACTION="test.cgi" METHOD="post" ENCTYPE="text/plain" onSubmit="return submitCheck()"> <SELECT NAME="yubin">【選択して下さい】 <OPTION SELECTED>ほげほげ</OPTION></SELECT> <SELECT NAME="jusho">【選択して下さい】 <OPTION SELECTED>ほげほげ</OPTION></SELECT> <SELECT NAME="jusho2">【選択して下さい】 <OPTION SELECTED>ほげほげ</OPTION></SELECT> <INPUT TYPE="submit" VALUE="送 信" onClick="document.kansou.name.value=''"> </CENTER> </FORM> </BODY> </HTML>

  • スピンボタンとエディットボックスの連携

    VC++でスピンボタンを押すと値が1増えて、それが計算式に反映され、エディットボックスの値を変えるとそれも計算式に反映される。 というスピンボタンとエディットボックスを連携したプログラムの作成が上手くいきません。 エディットボックスのメッセージは何を用いればいいのでしょうか。具体的にはエディットボックスに値を入力し、エンターキーをクリックした時にすぐに計算式を実行できるようにしたいのですができません。そのやり方がわかりません。 できたとしてもスピンボタンとの連携が上手くいきません。何かよい方法はないか教えてください。

  • GetWindowTextの使い方

    PocketPC2003を使ってアプリを使っているのですが エディットボックスに入力された文字列を 取得する方法が分からず困っております。 エディットボックスに対して、classwizardで CEdit型のm_zip変数を作成しました。 そこで、 CString buf; m_zip.GetWindowText(cs_buf); という所までは分かったのですが、これを char型の文字列にコピーしたいのですがどうすれば よいのでしょうか?。 開発環境は、 eMbedded Visual C++ 4.0です。

  • エクセルマクロでインプットボックスを使い…

    エクセルのマクロでインプットボックスを使い、氏名を入力させ、 その入力された値を、別のブックにコピーする方法を教えてください。 VBAは初心者で、具体的なアドバイスがあると助かります。 Private Sub Workbook_Open() Dim name As String name = InputBox("名前を入力してください") End Sub ここまではできました。 このブックはc:\データ\個別入力です。 このあと、インプットボックスに入力された氏名をコピーし、 c:\データ\集計というファイルのシート1を開き セルG5に値コピーをしたいのです。 できれば、インプットボックスに氏名を入力せずにキャンセルボタンが押されたり 閉じるボタンが押された場合には 「氏名を入力してください」と再度入力を促すようなメッセージが出ると大変感激です。 わかる方には簡単なんでしょうけど、 なにぶん初心者ですので… どうぞよろしくお願いします。

  • MFC:リッチエディットからUnicode文字列を受け取りたい

    MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

  • UpdateData( FALSE); による文字列データの表示更新(VC++6.0)

    VC++の超初心者です. UpdateData( FALSE ); を用いてエディットボックスの文字列の表示の更新を 試みているのですが,たとえば,以下のコードのようにボタンをクリックした際に文字列表示の更新を複数回行おうとするとうまくいきません. 具体的には一回目のUpdateData( FALSE );が反映されず二回目のUpdateData( FALSE );のみ反映されるという症状です. なおm_mojiretsuはCstring型でエディットボックスのDDX用の変数です. void CMyDlg::OnButton1() { DWORD p; m_mojiretsu=_T("mojirstu1"); UpdateData( FALSE ); /*5秒の待ち*/ p=timeGetTime(); while(1){if((timeGetTime()-p)>5000) break;} m_mojiretsu=_T("mojirstu1\r\nmojirstu2"); UpdateData( FALSE ); } 何か別の処理を行わなければいけないのでしょうか. どこかに根本的なミスがあるのでしょうか. VC歴3日程度で,右も左も分からず大変困っております.よろしくお願いします.

  • VC++6.0 エディットボックス、スピンコントロールについての質問

    VC++中の下ぐらいの技術者です。 エディットボックスにfloat型のメンバ変数を関連付けて使っています。 しかし、実際に値を打ち込むときに小数点、つまり「.」キーを押すと、 エディットボックス内でカーソルが先頭に戻ってしまいます。 これは直せませんか? また、スピンをエディットボックスのタブオーダーの次に配置し、プロパティのスタイルで 「自動関連付け」と「数値の自動表示」にチェックを入れたら、 そのコントロールが配置されたダイアログを表示するとエラーで表示できません。 これらの原因、解決方法の分かる方ご教授お願いします。

  • 住所録を作りたい

    『MySQL入門以前』という本をみながら住所録をつくっています。 1、htmlファイル データ登録画面用 ↓ 2、phpファイル データをMySQLデータベースに書き込み ↓ 3、phpファイル MySQLのテーブルから全体を読み出し の3つのファイルから構成しています。 データ登録画面で、全角文字『愛知県』をいれると データベースに新しいデータが追加されません。 半角英数字abcや123なら、新しいデータが追加されます。 どうしたら全角文字も対応させられるのでしょうか。 ファイルの一部 <form action="touroku.php" method="post"> <p>氏名:<input type="text" name="simei" size="40"></p> <p>郵便番号:<input type="text" name="yubin1" size="5">-<input type="text" name="yubin2" size="8"></p> <p>住所1:<input type="text" name="jusho1" size="50"></p> <p><input type="submit" value="登録"> <input type="reset" value="リセット"></p> </form> MySQL 5.0 PHP 5.2.5.5 apache 2.0.59 Windowes XP

    • 締切済み
    • PHP
  • 文字列と変数の値をエディットボッスクに表示させたい

    VC++6.0,MFC,ダイアログベースでプログラミングしています。 エディットボックスに文字列と変数の値を表示させたいのですが、その方法が分かりません・・。 コンソールベースの場合の、 int a=1; printf("a = %d",a); で、「a = 1」と出力されるようにしたいです。 今は、 m_Display = "a = %d"; UpdateData(FALSE); UpdateWindow(); というように作っているので、上記と同様にできませんでした。 このような場合どうしたらよいのでしょうか? よろしくお願いします。

  • GetDlgItemInt( ) c++

    現在MFCでウィンドウプログラムを作成しています。 現在、エディットボックス(IDC_EDIT1)が1つあり その変数に CEdit m_ed1; と、もう1つ double d_ed1; があります。 どちらもIDC_EDIT1に対する変数です。 IDC_EDIT1で入力された値(2.56)をd_ed1に代入したいのです。 d_ed1 = GetDlgItemInt(IDC_EDIT1); としたらもちろん d_ed1には [2]しか入らないわけなのですが、 これを解消するにはどうしたらよいのでしょうか。 ご教授の程お願いいたします。

専門家に質問してみよう