MFC 日時をchar*に入れたいのですが。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かなたん
記事: 50
登録日時: 12年前
連絡を取る:

MFC 日時をchar*に入れたいのですが。

#1

投稿記事 by かなたん » 12年前

MFCでマインスイーパーを作っていて、今クリアタイムの記録部分を作っています。
日時をCTimeで取得し、クリアタイムと合わせて以下のようなフォーマットで記録しています。
999 0000/00/00 00:00:00
その記録は10個記録できるようにしていて、今それをランキング形式で記録させたいと思っています。
考えとしては、記録されたクリアタイムを抜き出し、今クリアしたタイムも含めて早い順にソートして、先頭に順位を付けて書きだそうと思っています。
1. 999 0000/00/00 00:00:00
ランキング形式にする前は、CTimeのFormatがCStringを返すことからReadString/WriteStringで読み書きしていました。
ですが、タイムを抜き出してソートしてなんてことを考えていると、私が慣れ親しんでいるfscanf/fprintfで読み書きしたいと思うようになりました。
CStringをintに変更する方法を知らないのと、intをCStringに変換するには一度char*に入れないとだめだと思っているからです。
まずソートしてそれからCStringに変換してCTimeの日時をつなげて―というのも考えましたが、やはりCStringをchar*に変換あるいはCTime以外の方法で日時を取得してchar*に入れるなんてことができたほうが楽だと思いました。
でも、char*からCStringへの変換は(CString)キャストで行えますが、CStringからchar*への変換方法がわかりません。
Google検索で「CString char」と調べてみると、strcpyで行えるとありました。
ですが、使ってみると
エラー 1 error C2664: 'strcpy' : 2 番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
と言われてしまってできませんでした。
(LPTSTR)(LPCTSTR)でキャストするといいという話もありましたが、それも
エラー 1 error C2664: 'strcpy' : 2 番目の引数を 'LPTSTR' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
と言われてしまってできませんでした。
どのようにしたら取得した日時をchar*に入れられるでしょうか?
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MFC 日時をchar*に入れたいのですが。

#2

投稿記事 by softya(ソフト屋) » 12年前

CString型からのchar型へのコピーはUNICODEの場合に大変ややこしいことになります。
なので、TCHAR型へコピーするなどTCHAR系の処理で全て固めないといけません。
strcpyは_tcscpy、charはTCHARなどなどatoiも_tstoiと言う違う関数になります。
そうすれば、(LPCTSTR)にキャストするだけでコピーできるはずです。
UNICODEとマルチバイトの文字コードの違いは理解しておかないと後々苦労すると思いますので、この機会に。

それとCTimeのメンバ関数で時間とかintで取り出せますが、それではダメなのでしょうか?
「CTime のメンバ (ATL/MFC)」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かなたん
記事: 50
登録日時: 12年前
連絡を取る:

Re: MFC 日時をchar*に入れたいのですが。

#3

投稿記事 by かなたん » 12年前

softya(ソフト屋) さんが書きました:CString型からのchar型へのコピーはUNICODEの場合に大変ややこしいことになります。
なので、TCHAR型へコピーするなどTCHAR系の処理で全て固めないといけません。
strcpyは_tcscpy、charはTCHARなどなどatoiも_tstoiと言う違う関数になります。
そうすれば、(LPCTSTR)にキャストするだけでコピーできるはずです。
UNICODEとマルチバイトの文字コードの違いは理解しておかないと後々苦労すると思いますので、この機会に。
CStringとcharの相互変換
などを見てみると普通にstrcmpで行けるみたいに書いてありましたが、それらの環境はUNICODEじゃなくてマルチバイト文字だったってことですかね?
CStringへの代入が"文字列"ではだめでL"文字列"や_T("文字列")でないとならないというのもマルチバイトとUNICODEとの違いですかね。
TCHAR型や_tcscpyなどは初めて聞きましたが、そういう違いもあるんですね。
softya(ソフト屋) さんが書きました:それとCTimeのメンバ関数で時間とかintで取り出せますが、それではダメなのでしょうか?
あ。
そういうのもあるんですね。
というか、私がMFCでの日時取得の参考に利用したMFC編 - CTimeとCTimeSpanをもう一度見てみると、そういう話もきちんと書いてありましたね。
そこで見たFormat("%Y/%m/%d %H:%M:%S")が便利だと思い、それ以外は存在を忘れていました。
でも今はchar*にできればなんでもいいので、Formatは使わずにそれらとsprintfを使って自分でフォーマットを整えることにします。

ありがとうございました。
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MFC 日時をchar*に入れたいのですが。

#4

投稿記事 by softya(ソフト屋) » 12年前

VC++2005以前とVC++2005以降ではデフォルトの文字コードが違うとか、VC++7.0(Visual C++.NET 2002)でMFC/ATLが統合したとか色々違いがあります。
MFC関係のサイトでは大ヒットしたVC++6.0前提で書かれた古いものもありますので見るときは注意してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

かなたん
記事: 50
登録日時: 12年前
連絡を取る:

Re: MFC 日時をchar*に入れたいのですが。

#5

投稿記事 by かなたん » 12年前

softya(ソフト屋) さんが書きました:VC++2005以前とVC++2005以降ではデフォルトの文字コードが違うとか、VC++7.0(Visual C++.NET 2002)でMFC/ATLが統合したとか色々違いがあります。
MFC関係のサイトでは大ヒットしたVC++6.0前提で書かれた古いものもありますので見るときは注意してくださいね。
そういうことだったんですね。
これからはそういうことも注意することにします。
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

閉鎖

“C言語何でも質問掲示板” へ戻る