Windows環境でC言語のプログラムにファイルをドラッグして読み込む方法について

このQ&Aのポイント
  • Windows環境でC言語のプログラムを作成し、ファイルをドラッグして読み込む方法についての質問です。
  • 現在のプログラムでは、コマンドプロンプトでの入力では問題なく動作しているが、ファイルをドラッグした場合に正常に動作しないという問題が発生しています。
  • ファイルをドラッグした場合の原因と対策方法について教えてください。
回答を見る
  • ベストアンサー

Win環境においてドラッグに対応

Windows環境でC言語のプログラミングをしております。 main関数の引数、ファイルの入出力に関する質問になります。 ★実行環境 コンパイラ:MinGW(GNU GCCコンパイラ) OS:Windows XP Professional ★やりたい事 データファイルをEXEファイルにドラッグして、そのファイルの中身を読み込み 読み込んだデータを利用してファイルを出力。 ★出力結果イメージ 文字列「123456789」が一行に入力されているテキストデータ「data.txt」を、 作成した「io.c」をコンパイルしてできた実行ファイル「io.exe」にドラッグし、 ドラッグされたファイル名をmain引数で受け取り、 そのファイルを読み込み下記のような内容のテキストファイル「output.txt」を作成する。 ----- 1 -----   (中略) ----- 9 ----- ★現在のソース(エラー処理等省略) #include <stdio.h> #define MAX 100 int main(int argc,char *argv[]) { FILE *in; FILE *out; char data[MAX]; int i; if((in = fopen(argv[1],"r")) == NULL) { return 0; } if((out = fopen("output.txt","w")) == NULL) { return 0; } fgets(data,MAX,in); for(i = 0;data[i] != '\0';i++) { fprintf(out,"----- %c -----\n",data[i]); } fclose(in); fclose(out); return 0; } ★問題点 コマンドプロンプトで「io.exe data.txt」と入力すると問題無くexeのカレントディレクトリに「output.txt」ができ、 中身も求めているデータなのですが、Windows上で data.txtを直接マウスでio.exeにドラッグすると、output.txtが出力されません。 実際にargv[1]には正常にファイル名のフルパスが入っており、 argv[1]を使用してファイルの内容を読み取る事に成功しています。 しかし、ドラッグした場合のみfprintfが求めている結果を返してくれません。 この原因、および対策方法をご教授頂ければと思います。 よろしくお願い致します。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

実行時のカレントフォルダーが違うためでしょう WindwosでEXEファイルなどにそのままドラッグアンドドロップした場合 最近のWinXPなどは C:\Docuemnts and Settings\ユーザー名 フォルダをカレントにして動作するようですよ PIFファイルや ショートカットと作成して作業フォルダを指示してみましょう または アプリケーション内で フォルダーを決め打ち(ハードコーディング)にしてしまうとか

xkuonx
質問者

お礼

ご回答ありがとうございます。 今見てみたら「C:\Docuemnts and Settings\ユーザー名」フォルダにoutput.txtが正常に生成されていました! また、 「if((out = fopen("output.txt","w")) == NULL)」を 「if((out = fopen("c:\\c\\output.txt","w")) == NULL)」 のように変更を加えてみたところ、指定したディレクトリにファイルが出力されました。 ありがとうございました。

関連するQ&A

  • CUIプログラムにドラッグして1度に複数の変換は?

    みなさま、こんにちは。 Visual c++2010Express-Cを用いて、C言語のプログラムを作成しています。CUIのプログラムで、作成されたexeにファイルをドラッグしてファイルの変換をするプログラムです。 main.c の始まりは int main(int argc, char *argv[]) です。 ココで問題があるのですが、作成されたexeには1つのファイルをドラッグすることでしか変換出来ない、つまり1度のドラッグで1つのファイルしか変換出来ません。 現在、400ファイル程あるのですが、400回もドラッグをするのは果てしなく苦痛です。 int main(int argc, char *argv[]) 上記を変更して、複数のファイルを選択して1度のexeへのドラッグで変換出来ないものでしょうか? もしくは違った方法がありますでしょうか? どなたかお分かりになりましたら、ご教示願えないでしょうか? お手数をおかけ致しますが、よろしくお願いいたします。

  • 変数の値がおかしくなる

    以下のようなプログラム(DLLとEXE)を書いたのですが、変数の値がおかしくなる(●参照)箇所があります。原因がお分かりになりましたら、ご回答をよろしくお願い致します。 ●mkdll.cppの、sub1()の(※1)までは、input[]が正しい値で入っているが、(※2)で値がおかしくなる。(※1)から(※2)までで、input[]は参照するだけです。 ---test.cpp(EXE)--- … main(){ int input[10],output[10]; int err; CDLL DLL; err = DLL.func(input,output); … return(0); } ---test.cpp End--- ---mkdll.h(DLL)--- … class __declspec(dllexport) CDLL{ public: int func(int *input, int *output); private: int sub1(int *input, int *output); int sub2(int in, int out); … }; ---mkdll.h End--- ---mkdll.cpp(DLL)--- #include "mkdll.h" … int CDLL::func(int *input, int*output){ int i; int error; error = sub1(input, output); return(error); } int CDLL::sub1(int *input, int *outout){ int i; int in1, in2, out1, out2; int err; //(※1) for(i=0; i<5; i++){ err = 0; in1 = input[i*2]; in2 = input[i*2+1]; //(※2) err = sub2(in1, out1); if(err != 0) return(err); … } } … ---mkdll.cpp End---

  • バイナリデータをテキストファイルに出力したい

    以下のソースファイル(test.c) が、 バイナリデータをテキストファイルに するものらしいのですが、 ファイル名(例えば bi.dat)を指定する方法が わかりません。 C++は勉強し始めたばかりで 詳しくありません。 よろしくお願い致します #include <stdio.h> int main( int argc, char *argv[]) { FILE *fpIn; FILE *fpOut; short snData; if( argc < 2) { printf("ファイル名を入れてください。"); return -1; } fpIn = fopen( "argv[1]" , "rb"); if( fpIn == NULL) { printf("入力ファイル %s を開けませんでした。", argv[1]); return -2; } fpOut = fopen( "output.txt", "w"); if( fpOut == NULL) { printf("出力ファイル output.txt を開けませんでした。"); fclose(fpIn); return -3; } while( fread( &snData, sizeof(short), 1, fpIn) == 1) { fprintf( fpOut, "%d\n", snData); }; fclose(fpIn); fclose(fpOut); return 0; }

  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

  • stderrとstdout

    次のようなプログラムを、./a.outと./a.out>out.txtのように実行したところ、前者は output1 後者は output1 output2 output3 のようになりましたが、なぜこうなるか理由がわかりません。 自分では、stderrとstdoutが関係してるのだと思うのですが、初心者なのでこれらがどういうプログラムなのかもよくわかっていません。どなかなぜこうなるのか教えていただけないでしょうか。 #include<stdio.h> int main(int argc,char **argv){ fprintf(stderr,"output1\n"); fprintf(stdout,"output2\n"); printf("output3\n") }

  • プログラムが間違っているようなのですが

    ファイルからデータを読み込み、そのファイル内のデータの最大値・最小値を求めるプログラムを作ろうとしているのですが、実行結果が 最大値:0 最小値:0 となり、max2とmin2にうまく値が入っていないようなのです。 main関数にsub_main;を追記してみたりと色々試しているのですが、うまくいきません。 ファイルの読み込みがうまくいっていないのでしょうか。 もしくはポインタの使い方がまずいのでしょうか。 ファイルの内容は 20 40 30 ・ ・ ・ という感じの、不規則な数字の羅列で、今は10個入っています(データ個数が分からない場合も考えているのですが・・・)。 プログラム初心者なので難しいことはあまり分からないですが、助言を頂ければ嬉しいです。 #include<stdio.h> int sub_main(int *tensu,int *max,int *min) { int i=0; FILE *fp; fp = fopen("11.txt","r"); while(fscanf(fp,"%d",&*tensu)!=EOF); { for(i=0;i<10;i++) { if(*tensu+i>*max) *max=*tensu+i; if(*tensu+i<*min) *min=*tensu+i; } } fclose(fp); } main() { int max2=0,min2=0; int *max=&max2; int *min=&min2; printf("最大値:%d\n最小値:%d\n",max2,min2); }

  • どうしてもわかりません2

    #include <stdio.h> #include <string.h> #define MAX_LINE_SIZE 1024 #define NN 1000000 main(int argc, char* argv[]) { char fname[256]; char buf[MAX_LINE_SIZE]; int i; FILE *fp; for(i=1; i<argc; i++) { bzero(fname, 256); strcpy(fname, argv[i]); if( !(fp = fopen(fname, "r"))) { printf("File Open Error.\n"); exit(1); } while( fgets(buf, MAX_LINE_SIZE, fp ) ) { printf("%s", buf); } fclose(fp); } } このプログラムをコンパイルして(実行形式はa.out)コマンドラインから 以下のようなデータのテキストファイルna.txtを実行しました。./a.out na.txtするとこのソースだとbufに一行目がすべて文字列として入ってしまうと思います。そうではなく、1行目の数字ひとつずつを取り出す方法が知りたいです。たしか数字とか空白とかを判定する関数があったともうのですが、どうしてもわかりません。 ちなみにこの問いかけからこの問いがきています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1577294 1 2 3 4 5 6 2 3 4 5

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • txtファイルの文字を配列に格納

    ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード

専門家に質問してみよう