「CStringから、const char *に変換できない」


D  2009-05-01 18:42:27  No: 70091

私が確認しているのは入門書の(林晴比古さんのビギナー編のP.421)の動作確認です。環境はVC++ .NET 2005。C言語スタイルで

if ((fin = fopen(filename, "rb")) = NULL) {
          text = text + buf;
(前後省略してます。)

のような記述をした場合にうまくコンパイルされず、

1番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。

というメッセージがでてきてしまいます。

ネットでいろいろ検索してみましたがわからなかったので御願いします。例えば、ここの掲示板でも似た質問として

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200707/07070018.txt

でアップされています。この内容に従って、デフォルトのコンパイル環境で文字セットがUnicodeがデフォルトになっていることで起きる問題である可能性があるとのことで、マルチバイトにしたら一応通り、目的の動作確認はできましたが、Warningが取れないので、やはり釈然としません。本当に正しい方法は、やはり特定の関数を使用したり、コード記載を追記するのではないかと考え始めました。


Blue  2009-05-01 18:51:40  No: 70092

CStringを扱うのであれば、fopenではなく、TCHAR対応の
_tfopenを使ってください。
>if ((fin = fopen(filename, "rb")) = NULL) {
if ((fin = _tfopen(filename, _T("rb"))) = NULL) {

http://msdn.microsoft.com/ja-jp/library/yeby3zcb(VS.80).aspx

>Warningが取れないので
は本題とは別で、xxx_sを使えってやつなのでは?


D  2009-05-01 19:43:37  No: 70093

>Blueさま
  すいません。初心者への質問に即行での御回答ありがとうございます。

  実は投稿する際、書籍の事例を書き写してしまいましたが、自分で調べて次のようにしていました。

if ((fin = fopen(filename, _T("rb"))) = NULL)

_topenを使う方法は存じ上げませんでしたが、_Tを入れた場合は_topenにするかしないかに関わらず(&環境をマルチバイトにさえしておけば)ビルドまで通り動作までは一応するみたいです。

xxx_sを使うというのも合っているかどうか、それとは別のフェーズで

fopen_s

のような形でやってはみていたのですが、今度は、

"関数に 2 個の引数を指定できません。"

と言ったerrorコメントが出てきたので混乱しそうになったので、一旦引いて他の方法を探していました。ただ、上の修正を施した上に、_s にしても同じErrorメッセージが出るようです。


Blue  2009-05-01 19:50:32  No: 70094

MSDNで確認してみてください。
http://msdn.microsoft.com/ja-jp/library/z5hh6ee9(VS.80).aspx
fopen_s(_tfopen_s)の引数は3つで、戻り値はerrno_tです。

>_topen
ではなく _tfopenです。
fopenに対応するのは_tfopen
_openに対応するのは_topenです。

fopenと_openでは戻り値も違いますし。


D  2009-05-09 07:22:07  No: 70095

Blueさま

すいません。ちょっと日時が空いてしまいましたが、投げ出した
わけではありません。もう少し考えさせて下さい。

主題からは外れますが、使用している書籍が2002/2003年対応のもので、
ソフトが2005前提、つい最近、.NET Version のソフトが、MFC(native)
と、.NET対応のプログラミング方法があるという意味を本当に認識した
ような状況でして、初期設定の意味するところ、簡単なCastの方法など
組み合わせの違いで動いたり動かなくなったりするメカニズムが急激に
わかってきたので総合的にいろいろ見ています。それらをもう少し頭の
中で整理して戻ってきます。


吉行順子の助  2009-05-10 09:15:36  No: 70096

>if ((fin = fopen(filename, "rb")) = NULL) {
もしかすると、NULLの前が==でなく、=になってるのがまずいという話かな。

因みに、俺は二重括弧が嫌いなので、
if (fin = fopen(filename, "rb"),fin  == NULL) {
と書く。こちらのほうが分かりやすいと思うのにあまり見ないのは、
何か問題があるのだろうか。


Ban  2009-05-10 13:30:41  No: 70097

> 主題からは外れますが、使用している書籍が2002/2003年対応のもので、

TCHARを *ちゃんと* 使っておくと設定をUNICODEにしてもMBSにしても動く
ってのは2002以前、VC6とかの頃からMSは推奨してたはずで、
単にそれまでちゃんと作法に従ってなかった本が多かっただけという話も。

("初心者に説明すると混乱するだろうからあえて…"という方針だったのか、
 "C/C++の標準ではない特定OS固有の話なので…"という方針だったのか、
 単に作者も知らなかったのか、まぁ平気だろうと思っていたのか…
 時代背景も含めて、理由は色々あるのかと思いますが)

> 何か問題があるのだろうか。
# きっとfinを二回書くのがイヤなのでは>C言語使い
# ちなみに私は多分、二行に分けて書きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加