- ベストアンサー
fopen.cの中身について
いつもお世話になっています。 VS2005でWindowsアプリケーション作成を行っています。 ただいまファイル操作を行っているのですが、あるファイルを読み込みモードでfopenしようとする時点でアプリが中断されてしまい、fopen.cファイルが表示され下記のソースにチャックがされます。 if(*file==_T('\0')) { errno=EINVAL; return NULL; } このソースコードはどういう意味のものなのでしょうか。 エラー解決のため、ご教授お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>その呼び出し履歴から自分のコードまで戻って確認をする >というやり方?を教えていただきたいです。 まず、確認ですが… fopen.cの掲示された行で停止する。んですよね? 停止した状態から、デフォルトで右下のウィンドウに「呼び出し履歴」というタブがあるはずです。 赤丸に黄色い矢印で現在の位置(fopen.cのライブラリ内?)が示されているかと思われます。 下の行をダブルクリックすると、その呼び出し元のソースに移動できます。 # ソースがない場合はディスアセンブリされたコードの位置。 同じように1行下をダブルクリック…と続けていくと、どこかで自分の書いたコードにたどり着けるハズです。 # 自動生成されたファイル…という場合もあり得ますが。 そこで、呼び出した時の引数の内容などが確認できるかと思います。 http://www.google.co.jp/search?hl=ja&num=30&q=%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%B1%A5%E6%AD%B4+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0&btnG=%E6%A4%9C%E7%B4%A2&lr=&aq=f&oq= ただし、コールスタックを破壊していた場合は、呼び出し履歴からは辿れませんが…… 推定では、fopen("","r")などの様に第1引数で渡すファイル名が空になっている。 または、MBCSなfopen()にUNICODEな文字列の入ったモノを渡している…等でしょうか……
その他の回答 (2)
- cyacya2000
- ベストアンサー率54% (39/71)
例えば、 fopen(filename,"r"); として、この文が実行されるときに、filenameの内容が空なのではないでしょうか? >その呼び出し履歴から自分のコードまで戻って確認をする というやり方?を教えていただきたいです。 今、手元にVS2008しかないのですが、メニューのデバッグからウィンドウ→呼び出し履歴で、呼び出し履歴ウィンドウを表示することが可能です。もしかしたら、呼び出し履歴のところはコールスタックになっているかもしれません。
お礼
何もしていない段階で「デバッグ」メニューを見ると、 呼び出し履歴は無かったのですが、実行して中断された状態で メニューのデバッグ→ウィンドウに呼び出し履歴を発見いたしました。 そこでWr5さんの教えてくださった通りに見ていくと、ファイル名の値が 0x445c3a43<不適切なPtr> となっていました。 やり方を教えていただきありがとうございます。 続きは改めて上記に示しておきます。
- Wr5
- ベストアンサー率53% (2173/4061)
呼び出し履歴から自分のコードまで戻って、引数に渡しているモノの確認をされたらどうでしょうか? ファイル名渡していない…っぽいですが。
お礼
早いお返事ありがとうございます。 ご教授の通り確認をしたいのですが、 まだVS2005を使ってまもないので、 その呼び出し履歴から自分のコードまで戻って確認をする というやり方?を教えていただきたいです。 面倒で申し訳ありませんが、よろしくお願いいたします。 何度かファイル操作があるプログラムなのですが、 今まで普通にファイルオープンしていたのに あるファイルをオープンしようとするとエラーが出てしまうんです。 そのfopenをコメントアウトするとプログラムは正常に起動します。 他にもfopenは使っているのですが何故ここのfopenだけ… 頑張ってエラー処理していきたいと思います。
お礼
お返事遅くなりごめんなさい。 丁寧なご回答ありがとうございます。 下記にも示してありますが、 Wr5さんとcyacyaさんが教えてくださったやり方で調べたところ、 ファイル名の値は 0x445c3a43<不適切なPtr> となっていました。 よく調べてみると、ファイルは読み込みモードで開けていますが fscanfで読み込めない状態になっているようです。 読み込みたいファイルの中身は C:\Test\Debug\Data.txt Data.txt のように、あるフルパス名とファイル名が書き込まれてあります。 Wr5さんがおっしゃっているように、 「UNICODEな文字列の入ったモノを渡している」のでしょうか。 この場合、「書き換え」が必要になってくるのでしょうか。 質問ばかりになってしまいごめんなさい。Webで調べてもしっくりくるものが 無かったので・・・よろしければ教えていただきたいです。
補足
こんばんは、今回質問させていただいた者です。 ただいまパソコンに向かって格闘していたところ プログラムが成功しましたので、Wr5さんの補足内容に失礼して ご報告させていただきます。Wr5さんごめんなさい。 いろいろ調べたところ、今までのプログラムのfopenでは 文字列さえ読み込めない状態になっていた事に気づきました。 そこで文字列を入れる変数の型を変えたり等いじっていましたら 文字列が読み込めるようになりました。 これでファイルの中身のフルパス名、ファイル名を読み込めることができました。 大変お騒がせいたしました。 皆さんのお蔭で、C++やVS2005の使い方についてより理解することができました。 この場をお借りしてお礼申し上げます。 ありがとうございました。