CStringからint変換 – プログラミング – Home

通知
すべてクリア

[解決済] CStringからint変換

固定ページ 1 / 2

PSP
 PSP
(@PSP)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

お世話になります。

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

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

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

CString test = _T(100);
int seisu;

seisu = atoi(test);

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

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

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

なぜでしょうか??

宜しくお願いいたします


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

atoi 改め _ttoi もしくは _tstoi を使ってみてください。


返信引用
yoh2
 yoh2
(@yoh2)
ゲスト
結合: 18年前
投稿: 70
 

wchar_tとcharの違いが原因なら、

> seisu = atoi(test);

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

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


返信引用
しろう
 しろう
(@しろう)
ゲスト
結合: 23年前
投稿: 17
 

VC++6.0(MFC)でもVC++2003(MFC)でも元々のソースで100となりますよ@確認済み。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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


返信引用
PSP
 PSP
(@PSP)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

 επιστημηさん yoh2さん
 ご回答ありがとうございます
 
返答が遅れてしまいました。申し訳ありません。

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

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

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>seisu////0になっています。
はどうやって確認していますか?
ローカルウィンドウ?

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

sscanfは駄目でしょうか。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>sscanfは駄目でしょうか
CStringだったですね。
GetAT使っても駄目ですか。
戻り値がTCHAR型なのが気になります。
VC2005だと駄目なんでしょうか。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>sscanfは駄目でしょうか。
TCHAR対応のものを紹介すべきかと。

_stscanf

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

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


返信引用
PSP
 PSP
(@PSP)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

Blueさん ITOさん

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

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

訂正前

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

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

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

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

25901,30000

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


返信引用
PSP
 PSP
(@PSP)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

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

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

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

char str[1024]

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

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

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


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

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


返信引用
PSP
 PSP
(@PSP)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

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

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

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

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

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

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

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


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました