お世話になります。
今、VC++2005のMFCでプログラムしています。
ちょっと意味不明な事があるので、皆さんに意見を聞きたいと思いました。
CStringからintの変換がうまく行かないのです。
具体的には
CString test = _T(100);
int seisu;
seisu = atoi(test);
これでseisuには整数の100が入りますよね? それが入らないのです。
デバッグをかけてみると
atoi(test)/////100になってる
seisu////0になっています。
なぜでしょうか??
宜しくお願いいたします
atoi 改め _ttoi もしくは _tstoi を使ってみてください。
wchar_tとcharの違いが原因なら、
> seisu = atoi(test);
でコンパイルエラーが発生しそうなのですが、コンパイルは通っているんですよね。
何か不思議。
# 実際のコードではキャストをしているのかな?
類似スレ:
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200707/07070018.txt
VC++6.0(MFC)でもVC++2003(MFC)でも元々のソースで100となりますよ@確認済み。
> VC++6.0(MFC)でもVC++2003(MFC)でも元々のソースで100となりますよ@確認済み。
コンパイル時のデフォルトオプションが
VC++6.0,VC++2003とVC++2005は違います。
(yoh2さんが載せてくれたリンク先でεπιστημηさんが既におっしゃっていることなんで
すけどね。
>なんですが、VIsual Studio 2005以降、
>Unicodeを使うのがデフォルトになってます。)
質問者がVC++2005といっている以上それ以外の環境で検証しても
あまり意味ないでしょう。
επιστημηさん yoh2さん
ご回答ありがとうございます
返答が遅れてしまいました。申し訳ありません。
_ttoiと_tstoiを両方使用したのですが、両方の結果ともseisuには0が入っています。
実際にはファイルから数字を読み取りその数字を整数に変換するというものです。
デバッグすると確かにファイルからその数字は取れていて、変数testに確実に入って
います。
そのCString変数testを整数に変換する作業を
seisu = ttoi(test);としました。
しかし結果は変わりませんでした。どうすればいいでしょうか?
宜しくお願いいたします。
>seisu////0になっています。
はどうやって確認していますか?
ローカルウィンドウ?
>実際にはファイルから数字を読み取りその数字を整数に変換するというものです。
確認用のソリューションをちょこっと作って、
最低限のコードでも再発するか確認してみてはどうでしょうか?
ちなみに全角文字の数字はatoi系では変換できませんので。
sscanfは駄目でしょうか。
>sscanfは駄目でしょうか
CStringだったですね。
GetAT使っても駄目ですか。
戻り値がTCHAR型なのが気になります。
VC2005だと駄目なんでしょうか。
>sscanfは駄目でしょうか。
TCHAR対応のものを紹介すべきかと。
_stscanf
他にも、_tcstodとかもありますけどね。
もっともファイルから読んでいるなら、_ftscanfっていうのもありますけどね。
# CStringを使っているところから,_tfopen を使っていなさそうですけど。
Blueさん ITOさん
ご回答ありがとうございます。
本当に不思議なのですが、ファイルの一部を訂正したら値が_ttoiで入りました!
訂正前
-------------------------
25901(改行)
30000(改行)
EOF
-------------------------
訂正後
-------------------------
25901(改行)
30000(改行)
EOF
-------------------------
このようにしたら値が入ったにですが、本当に納得いかないです。
CFile::Readで読み込んでます。
上の書き方だとだめなのでしょうか?
>CFile::Readで読み込んでます。
からどのようにCStringに入れたのでしょうか?
25901,30000
という各値をとりたいなら、改行ごとにCString変数に読み込める
CStdioFileのReadStringを使ったほうが便利です。
Blueさん
ご回答ありがとうございます。
>>CFile::Readで読み込んでます。
>からどのようにCStringに入れたのでしょうか?
一度、読み込みようの変数
char str[1024]
を用意してstrに読み込ませた後に、CStringに代入しておりました。
>改行ごとにCString変数に読み込める
>CStdioFileのReadStringを使ったほうが便利です。
そんな関数があったのですか・・。知りませんでした。
少し調べてみます。
どうしても、char じゃなきゃ、wchar_t じゃなきゃ、という制限がないのであれば
基本的に TCHAR 体系を使うことをお薦めします。
# char[] → CString に限っては、CString のコンストラクタが吸収してくれますが。
RAPTさん ご回答ありがとうございます。
返信が遅れてしまい誠に申し訳ありません。
>基本的に TCHAR 体系を使うことをお薦めします。
今回はUNICODEを使用していないので、UNICODEを使用するときに
RAPTさんのアドバイス通りTCHARを使用させていただきます。
ありがとうございました。
今回のCString型からint型に変換出来なかったのは上記にも示しましたが、
よくわからないうちに値が入っていました。それもこれから追求していこうと
思います。
Blueさんのご指摘通りにCStdioFileのReadStringを使用したのですが、
今回、僕がやりたいことにぴったりで、これを使用しました。
皆様、ありがとうございました。