アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在コマンドライン引数を利用した、Drag&Dropで入力されたバイナリファイルをテキストファイルに出力するプログラムをCで作成しています。

その過程で、Drag&Dropされたファイル以外にもテキストファイル(option.txt)を読み込みたいのですが、どうしてもそのファイルをオープンすることができません。

次は問題の部分だけを抜き出したソースです。

#include <stdio.h>
int main(int argc,char *argv[])
{
 FILE *s;
 s=fopen("option.txt","r");
 if( !s ){
  printf("Error: cannot open file(option.txt)\n");
 }
  else printf("OK!\n");

 if(argc == 2) printf("%s\n",argv[1]);
 else if(argc ==1) printf("No Drag&Drop File\n");

 return 0;
}

Drag&Dropしない時(作成された実行ファイルをダブルクリックで起動する時)は
 OK!
 No Drag&Drop File
となり、問題のoption.txtのファイルは開けているのですが、適当なバイナリファイル(7.chn)をDrag&Dropすると
 Error: cannot open file(option.txt)
 C:\Documents and Settings\[ユーザー名]\デスクトップ\Program\7.chn
と、先ほどまで開けていたoption.txtのテキストファイルが急に開けなくなってしまいました。

どうにも原因・解決策が分かりませんでしたので、お聞きしたくこちらに書き込みをさせてもらいました。

どなたか分かる方いらっしゃいましたらよろしくお願いします。

A 回答 (15件中11~15件)

No1です。



他の人の回答で質問の意味が解りました。
ちなみにコンパイル、実行し、質問内容の確認をしました。
"option.txt"をフルパスにすれば解決します。

失礼しました!

この回答への補足

すみません、表現がわかりづらかったようですね。

ご指摘とおりフルパスで試してみたところ、こちらでもファイルが開けることが確認できました。

本当は相対パスのほうが便利でよかったのですが、他の方がおっしゃっていたように、Drag元のディレクトリでカレントディレクトリが変わってしまうようであれば、絶対パスの方がいいのかもしれません。

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

補足日時:2006/12/16 17:37
    • good
    • 0

試してないので自信ないのですが"option.txt"を絶対パス("c:\\option.txt"など)で書いてみるのはどうでしょうか。

(Drag&Dropで実行した場合、プログラムはDrag元で実行されたような気がします。)

この回答への補足

絶対パスにするとちゃんと開くことができました。

しかし、Drag元とDrag先は実行ファイルやCのソースファイルがあるディレクトリにあり、そのディレクトリにoption.txtもありますので、カレントディレクトリにoption.txtもあるはずと思うのですが、この相対パスの指定方法で何が問題なのかが疑問には残るところではあります。

補足日時:2006/12/16 17:16
    • good
    • 0
この回答へのお礼

すみません、お礼を書くのを忘れてしまいました!

Dragもとのディレクトリでプログラムが実行されるとしたら、別のディレクトリからDragした場合を考えると、絶対パスのほうがいいのかもしれないですね。

どうも、ありがとうございました。

お礼日時:2006/12/16 17:45

多分、「カレントディレクトリ」が違うせいかと思われます。



Drag&Drop時はカレントが、
C:\Documents and Settings\[ユーザー名]\デスクトップ\Program\
になっているので、単に"option.txt"とかくと、
C:\Documents and Settings\[ユーザー名]\デスクトップ\Program\option.txt
を開こうとします。で、これが見つからずにエラーになってます。

絶対パスにするなり、GetModuleFileName等の利用を検討してください。

この回答への補足

いえ、そのoption.txtがあるディレクトリがカレントディレクトリですので、見つかるはずではないかと思うのですが、なぜかエラーが出てしまうという状況です。

絶対パスにしますとちゃんと開けましたので、相対パスが無理なようでしたら絶対パスでいきたいと思います。
それと初めてみましたがGetModuleFileNameというものもあるのですね。
こちらも調べてみようと思います。

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

補足日時:2006/12/16 17:10
    • good
    • 0

実行時のカレントディレクトリが違うだけでは?



>s=fopen("option.txt","r");

ファイル名をフルパスで指定してみてください。

この回答への補足

フルパスで指定するとちゃんと開けるようになりました。
ありがとうございます。

補足日時:2006/12/16 17:07
    • good
    • 0

今一質問の意味が解りません。



argcは引数に渡った文字列の個数ですので、Drag&Dropは関係ないですよ。 仮にコマンドで "実行ファイル名" "ファイル名"でもDrag&Dropした処理になりますよ。

まあそれはいいのですけど、気になるのはfcloseをしてないことですね。 fopenで開いた"option.txt"を閉じてません。

しかしながら、それで質問者が陥ってる状態にはならないと思いますが
・・・

開けなくなった状態でもoption.txtは存在しているんですか?

この回答への補足

指摘いただいたように、忘れていたファイルのクローズを試してみましたが、やはり状況は変わりませんでした。

option.txtはソースファイル・実行ファイルの存在するディレクトリにちゃんとあります。
パスの指定の方法は間違ってはいないと思うのですが…。

補足日時:2006/12/16 16:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!