こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルをドロップするとfopenからファイルが作成できません

C言語でコンソールアプリケーションを作っています。
ファイルをexeにドロップして実行し、別のファイルに結果を出力させたいのですが、出力ファイルが作成されません。

どのようにすればよろしいのでしょうか。

コンソールから渡すときはファイルが作成されます。
コンパイラはBorland C++ Compiler 5.5を使用しています。
以下にコードの一部を掲載します。

int main(int argc, char *argv[])
{
 char filename[256];
 FILE *inputFile;
 FILE *outputFile;
 int i;
 for(i=1; i<argc; i++)
 {
  if((inputFile=fopen(filename,"r")) == NULL)
  {/*エラー処理*/}
  sprintf(filename,"result%d.txt",i); // 出力ファイル名
  if((outputFile=fopen(filename,"w")) == NULL)
  {/*エラー処理*/}
  for(;;)
  {
   char ss[1024];
   if(fgets(ss,1024,inputFile) ==NULL) break;
   fputs(ss,outputFile);
  }
  fclose(inputFile);
  fclose(outputFile);
 }
 return 0;
}

投稿日時 - 2007-09-19 18:38:56

QNo.3359225

困ってます

質問者が選んだベストアンサー

うちの環境(WindowsXP)での場合ですが・・・

ダブルクリックで実行した場合のカレントディレクトリは、
exeファイルと同じ場所になりますが、

ドラッグ&ドロップで実行した場合のカレントディレクトリは、
環境変数 USERPROFILE と同じ場所になります。

例: C:\Documents and Settings\username

exeの場所や、ドラッグしたファイルの場所には関係なく、固定のようです。

ディレクトリを指定せず保存した場合、ここにファイルが作られていると思います。

下記のようなプログラムで、実行時のカレントディレクトリを調べてみて下さい。

#include <stdio.h>
#include <windows.h>
void main(void)
{
char s[255];
char c;
GetCurrentDirectory(255,s);
printf("%s\n", s);
c = getchar();
}

投稿日時 - 2007-09-19 19:31:26

お礼

ありがとうございました。
教えていただいたディレクトリに作成されていました。

起動方法によってカレントディレクトリが異なるとは、全く知りませんでした。

投稿日時 - 2007-09-19 21:20:07

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

★引数を参照していません。
・どこで argv[i] の引数文字列を参照しているのですか?
 ドロップしたファイル名は引数文字列としてプログラムに渡されます。
 この引数は argv[i] として参照できます。
>if((inputFile=fopen(filename,"r")) == NULL)
 ↑
 この行の『filename』を『argv[i]』に変更すれば良いのでは?
・プログラムの処理はドロップファイルのコピーですか?
 それなら下のようにサンプルで出来そうです。

サンプル:
int main( int argc, char *argv[] )
{
 char filename[ 256 ];
 char buff[ 1024 ];
 FILE *fpi;
 FILE *fpo;
 int i;
 
 for ( i = 1 ; i < argc ; i++ ){
  sprintf( filename, "result%d.txt", i );
  
  if ( (fpi = fopen(argv[i],"r")) != NULL ){
   if ( (fpo = fopen(filename,"w")) != NULL ){
    while ( fgets(buff,sizeof(buff),fpi) != NULL ){
     fputs( buff, fpo );
    }
    fclose( fpo );
   }
   fclose( fpi );
  }
 }
 return 0;
}
以上。

投稿日時 - 2007-09-19 19:09:14

お礼

迅速な対応、ありがとうございました。

投稿日時 - 2007-09-19 21:21:30

ANo.1

ファイルが作成されないって、どこに作成されることを期待していますか?

ソースを見る限りパスの指定がないようなのでCMD.exeと同じ場所に出来ていると思うのですが…

投稿日時 - 2007-09-19 19:00:51

補足

自作のexeファイルと同じディレクトリに作成したいのです。
CMD.exeと同じディレクトリを探してみましたが、見つかりませんでした。

CMD上で
 fileout.exe inputfile.txt
のようにファイルを渡したときは同じディレクトリに作成されます。

投稿日時 - 2007-09-19 19:54:57

お礼

解決することができました。
迅速な対応、ありがとうございました。

投稿日時 - 2007-09-19 21:22:23

あなたにオススメの質問