CStringからint変換

[戻る]
PSP 2007/07/17(火) 19:09:16
お世話になります。

今、VC++2005のMFCでプログラムしています。

ちょっと意味不明な事があるので、皆さんに意見を聞きたいと思いました。

CStringからintの変換がうまく行かないのです。
具体的には

CString    test = _T("100");
int        seisu;

seisu = atoi(test);

これでseisuには整数の100が入りますよね? それが入らないのです。

デバッグをかけてみると
atoi(test)/////100になってる

seisu////0になっています。

なぜでしょうか??

宜しくお願いいたします

επιστημη [HomePage] 2007/07/17(火) 19:20:54
atoi 改め _ttoi もしくは _tstoi を使ってみてください。

yoh2 [E-Mail] 2007/07/17(火) 22:40:53
wchar_tとcharの違いが原因なら、

> seisu = atoi(test);

でコンパイルエラーが発生しそうなのですが、コンパイルは通っているんですよね。
何か不思議。
# 実際のコードではキャストをしているのかな?

類似スレ:
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200707/07070018.txt

しろう 2007/07/18(水) 10:25:22
VC++6.0(MFC)でもVC++2003(MFC)でも元々のソースで100となりますよ@確認済み。

Blue 2007/07/18(水) 10:32:35
> VC++6.0(MFC)でもVC++2003(MFC)でも元々のソースで100となりますよ@確認済み。
コンパイル時のデフォルトオプションが
VC++6.0,VC++2003とVC++2005は違います。
(yoh2さんが載せてくれたリンク先でεπιστημηさんが既におっしゃっていることなんで
すけどね。
>なんですが、VIsual Studio 2005以降、
>Unicodeを使うのがデフォルトになってます。)

質問者がVC++2005といっている以上それ以外の環境で検証しても
あまり意味ないでしょう。

PSP 2007/07/18(水) 10:37:46
 επιστημηさん yoh2さん
 ご回答ありがとうございます
 
返答が遅れてしまいました。申し訳ありません。

_ttoiと_tstoiを両方使用したのですが、両方の結果ともseisuには0が入っています。
実際にはファイルから数字を読み取りその数字を整数に変換するというものです。
デバッグすると確かにファイルからその数字は取れていて、変数testに確実に入って
います。

そのCString変数testを整数に変換する作業を

seisu = ttoi(test);としました。

しかし結果は変わりませんでした。どうすればいいでしょうか?
宜しくお願いいたします。

Blue 2007/07/18(水) 10:48:38
>seisu////0になっています。
はどうやって確認していますか?
ローカルウィンドウ?

>実際にはファイルから数字を読み取りその数字を整数に変換するというものです。
確認用のソリューションをちょこっと作って、
最低限のコードでも再発するか確認してみてはどうでしょうか?


ちなみに全角文字の数字はatoi系では変換できませんので。

ITO 2007/07/18(水) 12:12:52
sscanfは駄目でしょうか。

ITO 2007/07/18(水) 12:32:40
>sscanfは駄目でしょうか
CStringだったですね。
GetAT使っても駄目ですか。
戻り値がTCHAR型なのが気になります。
VC2005だと駄目なんでしょうか。

Blue 2007/07/18(水) 12:33:15
>sscanfは駄目でしょうか。
TCHAR対応のものを紹介すべきかと。

_stscanf


他にも、_tcstodとかもありますけどね。

もっともファイルから読んでいるなら、_ftscanfっていうのもありますけどね。
# CStringを使っているところから,_tfopen を使っていなさそうですけど。

PSP 2007/07/18(水) 12:35:25
Blueさん ITOさん

ご回答ありがとうございます。

本当に不思議なのですが、ファイルの一部を訂正したら値が_ttoiで入りました!

訂正前

-------------------------
25901(改行)
30000(改行)

EOF
-------------------------

訂正後
-------------------------
25901(改行)
30000(改行)
EOF
-------------------------

このようにしたら値が入ったにですが、本当に納得いかないです。
CFile::Readで読み込んでます。

上の書き方だとだめなのでしょうか?

Blue 2007/07/18(水) 12:43:00
>CFile::Readで読み込んでます。
からどのようにCStringに入れたのでしょうか?

25901,30000

という各値をとりたいなら、改行ごとにCString変数に読み込める
CStdioFileのReadStringを使ったほうが便利です。

PSP 2007/07/18(水) 12:51:44
Blueさん 
ご回答ありがとうございます。

>>CFile::Readで読み込んでます。
>からどのようにCStringに入れたのでしょうか?

一度、読み込みようの変数

char  str[1024]

を用意してstrに読み込ませた後に、CStringに代入しておりました。

>改行ごとにCString変数に読み込める
>CStdioFileのReadStringを使ったほうが便利です。

そんな関数があったのですか・・。知りませんでした。
少し調べてみます。

RAPT [HomePage] 2007/07/19(木) 00:09:03
どうしても、char じゃなきゃ、wchar_t じゃなきゃ、という制限がないのであれば
基本的に TCHAR 体系を使うことをお薦めします。
# char[] → CString に限っては、CString のコンストラクタが吸収してくれますが。

PSP 2007/07/20(金) 11:45:52
[[解決]]
RAPTさん ご回答ありがとうございます。

返信が遅れてしまい誠に申し訳ありません。

>基本的に TCHAR 体系を使うことをお薦めします。

今回はUNICODEを使用していないので、UNICODEを使用するときに
RAPTさんのアドバイス通りTCHARを使用させていただきます。
ありがとうございました。

今回のCString型からint型に変換出来なかったのは上記にも示しましたが、
よくわからないうちに値が入っていました。それもこれから追求していこうと
思います。

Blueさんのご指摘通りにCStdioFileのReadStringを使用したのですが、
今回、僕がやりたいことにぴったりで、これを使用しました。

皆様、ありがとうございました。

RAPT [HomePage] 2007/07/21(土) 13:31:07
> 今回はUNICODEを使用していないので、UNICODEを使用するときに
> RAPTさんのアドバイス通りTCHARを使用させていただきます。
えーっと、ちょっと基本的な考えがずれているようなので軽く突っ込みます。
(↑の考えが絶対だめだと否定するのではありませんので、
 気を悪くなさらないでください)

非UNICODE体系で、今後UNICODE体系に移行するかもしれない、とか、
一時的にまたは恒久的に共存しうる可能性があるのであれば、
新規に作る場合は、なるべく TCHAR 系を使うことをお薦めします。

そうしておけば、UNICODE を使う場合、コンパイルオプションを変更するだけで
ソースコードの修正は不要になるからです。
また、ソースの再利用ができることになります。

過去の経験から参考までに。。(返信は不要です)

菟ー 2007/08/09(木) 22:12:43
さらっと、読んで突っ込みをば。
質問者・回答者の皆さんVS2005を使い込んでない模様・・・。


VS2005でMFCプロジェクト起すとデフォルトで「UNICODE使用」になる。
そして、char*とCStringをゴッチャ混ぜに使うなどやった日にゃ・・・

質問者さんの言う現象に悩まされることは茶飯事。

RAPT [HomePage] 2007/08/10(金) 01:45:59
> VS2005でMFCプロジェクト起すとデフォルトで「UNICODE使用」になる。
> そして、char*とCStringをゴッチャ混ぜに使うなどやった日にゃ・・・
レスをきちんと読みましょう。
そのことは、すでに最初の方で、Blueさん(επιστημηさん)が述べています。

PATIO 2007/08/10(金) 09:12:32
思うに訂正前の場合は最後の空行も変換していたのではないかなと
言う気がしますね。一番最後の結果だけを見てしまうと空行の変換結果に
なってしまうので0になるのではないかと。
自分で読み込んで分解していると言うことなのでちゃんと順番に
追えていないのではないかと。

古いスレッドには追加発言できません。