• ベストアンサー

VisualC++6.0 で main関数への引数

#include<stdio.h> int main(int argc,char *argv[]) {   FILE *fp;   fp=fopen("abc.txt","w"); } こんな感じの xyz という名前のプログラムがあります。 MS-DOSで、xyzと同じディレクトリから   xyz tekitou リターン と打ち込んでプログラムを起動させたらxyzと同じディレクトリの中に abc.txtを作成してくれます。xyz.exeのダブルクリック起動でも 同様の結果です。 だけどxyz.exeのアイコンの上に適当なファイルを ドラッグ&ドロップさせて起動させた場合 abc.txtは全然別の場所に作成されてしまいます。 正確に言うと、Windows98上でVisualC++6.0を使用して 上記のプログラムでデスクトップ上にxyz.exeを作成して (C:\WINDOWS\デスクトップ\xyz.exeの)アイコンに 適当なファイルをD&Dしてプログラムを実行したらC:\にabc.txtが できたということです。 私としては同じディレクトリ内に作成してくれなくては 都合が悪いのです。この現象が起きる理由あるいは 解決法をご存知の方がいらっしゃいましたらどうかよろしく お願いします。

  • aaaaa
  • お礼率87% (76/87)

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

  • ベストアンサー
回答No.2

#include "stdafx.h" #include "windows.h" int main(int argc, char* argv[]) { char buf[1024]; GetModuleFileName(NULL, buf, sizeof(buf)); // ここで // bufから xyz.exe を取り除き // テキストファイルのフルパスを生成する // ここで本来の処理 return 0; } GetModuleFileName()という関数を使えば xyz.exe の存在する位置のフルパスを取得できますから、それを使ってやればいいです。詳細はマニュアルを調べてください。

aaaaa
質問者

お礼

たいへんありがとうございます。 この方法を使えば完全に解決できました。

その他の回答 (1)

  • inoue64
  • ベストアンサー率29% (334/1115)
回答No.1

設定の変更が必要です xyz.exeを右クリック→プロパティ→プログラム→作業ディレクトリ これをC:\Windows\デスクトップに設定すればいいと思います

aaaaa
質問者

お礼

タブの出現方法を知りたかったのですが 本来の質問と大きく離れた内容なので 別の場で質問させてもらおうと思います。 たいへんありがとうございました。

aaaaa
質問者

補足

たいへんありがとうございます!! どうかもう一声お願いします。 xyz.exeを エル・エス・アイ ジャパン(株)の 「LSI C-86 Ver 3.3 試食版」 で作成したのならあなた様のおっしゃるとおりに解決できました。 ですがVCで作成した実行ファイルでは(私の環境では) 右クリック→プロパティ→・・・全般 のタブしかでてきません。 LSIで作成したものでは 全般、プログラム、フォント、メモリ、画面、その他 のタブが出てくるのですが・・・ VCでこれらの項目を出現させるにはどうしたらよいのでしょうか?

関連するQ&A

  • VisualC++6.0 で アイコンのドラッグ&ドロップ

     デスクトップ上のデータファイルアイコンを 実行ファイルにD&Dして起動し、起動したプログラムから データファイルのフルパスを得たいと思っています。  VisualC++6.0を使用して、ダイアナログベースで 作成しています。DragAcceptFiles、OnDropFiles 等を使うと思うのですが、使い方が分かりません。  初心者ですがよろしくお願いします。

  • VBAのSHELLを用いてEXEファイルを起動したものの、微妙にうまくいかない

    エクセルのVBAのshellを用いて、exeファイルを起動させてました。 exeファイルはCを用いたシンプルなもので、テキストファイルを作成します。(ソースは下記参照) C:\testのディレクトリにエクセルファイルを作成し、 Shell "C:\test\test.exe" を実行させたところ、ファイルはC:\testのディレクトリに出来ずに、マイドキュメントに出来ました。 このexeファイルを直接ダブルクリックしたときは、C:\testのディレクトリにテキストファイルが作成されます。 ダブルクリックしたときと同じように、C:\testのディレクトリにテキストファイルを作成する方法があれが教えてください。 よろしくおねがいします。 (ソース、hello.txtというファイルをつくり、hello!を書く) main( ) { FILE *fp; /* ファイルポインタ */ fp = fopen( "hello.txt", "w"); fprintf(fp,"hello!\n"); fclose(fp); return 0; }

  • main関数の中をスッキリさせたくて

    main関数をスッキリさせたくて、関数化してみたのですが、objファイルまではできるのですが実行ファイルができません。 エラー内容ですが、下のようにでます。 /* test_2.c(9) : error C2440: '関数' : 'FILE' から 'FILE *' に変換できません。 test_2.c(9) : warning C4024: 'read_f' : の型が 1 の仮引数および実引数と異なります。 test_2.c(10) : error C2440: '関数' : 'FILE' から 'FILE *' に変換できません。 test_2.c(10) : warning C4024: 'output_f' : の型が 1 の仮引数および実引数と異なります。 */ 書き方が間違ってるとは思うのですが、どこをどう直せばいいかわかりません。 教えてください。 #include <stdio.h> #include <stdlib.h> void read_f(FILE *f_p); void output_f(FILE *f_p); int main(void){ FILE *fp; read_f(*fp); output_f(*fp); fclose(fp); return 0; } void read_f(FILE *f_p){ int fn=0; char f_name[256]; printf(" text number 1, 2, 3, 4 : "); scanf("%d",&fn); sprintf(f_name,"map%d.txt",fn); if((f_p=fopen(f_name,"r"))==NULL){ /*f_nameを " " で囲まない!*/ printf("You will not be able to open the file\n"); exit(1); } } void output_f(FILE *f_p){ int i,j; int array[10][10]; for(j=0;j<10;j++){ for(i=0;i<10;i++){ fscanf(f_p,"%d",&array[i][j]); //画面表示 10*10 } printf("%d",array[i][j]); } printf("\n"); }

  • 直ぐ上のフォルダーへ移動

    下記のようなフォルダー構造のファイルがあるとします。  1) D:\ABC\XYZ\GGG  2) D:\ABC\FGG 1)の場合   D:ABC\GGG 2)の場合   D:\FGG のようターゲットフォルダー(GGG,FGG)を一つ上のフォルダーに名前を変えずに移動する 但しその場合、空になった元あった直上のフォルダー(XYZ,ABC)は削除するプログラムを教えて下さい。 バッチやスクリプトのプログラムを作成してデスクトップにショートカットのアイコンを作成し そこにドラッグ&ドロップで処理できれば嬉しいのですが 専用のアプリなど別の解決法があればお願いします。 現在ファイル整理中でターゲットフォルダーが多数あるので 一括で処理できれれば幸いです。

  • テキストファイルの同期

    はじめまして、超初心者プログラマのmoominといいます。 ファイルの同期プログラムに関して質問があるのですが、 あるテキストファイルを、他のディレクトリのテキストファイルとを 常に同期をするプログラムを作成しています。 これが作成したソースです。 ------------------------- #include "stdafx.h" #include <stdio.h> #include <windows.h> int _tmain(int argc, char *argv[]) { FILE *fp,*copy; int buffer; fp=fopen("○○○/×××.txt","rb"); copy=fopen("aaa/fff.txt","wb"); for(int i=1;i>0;i++){ fread(&buffer,sizeof(buffer),1,fp); fwrite(&buffer,sizeof(buffer),1,copy); if(feof(fp)){ fclose(fp); fclose(copy); } } return 0; } VC2008を利用して作成していますが、 一度きりの同期なら可能なのですが、 常に同期するというプログラムがわかりません。 どう変えればよいでしょうか?

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • xcodeでのファイル操作について

    xcodeでのファイル操作について いろいろ自分で調べてみたのですが、 xcodeでファイル操作が上手く出来ません。 例えば、 #include <stdio.h> int main () { int x; FILE *fp; fp = fopen("input.txt", "r"); fscanf(fp,"%d", &x); printf("%d",x); fclose(fp); return 0; } というプログラムを書いても、input.txtの内容によらず「0」と出力されます。 つまりinput.txtが開けていないということだと思うのですが、 どうすればちゃんと開けるようになるのでしょうか? 教えて下さい! xcodeのバージョンは3.2.2です。 出来れば、ソースの方ではなく、xcodeの設定をいじってなんとかする方が良いです。

    • ベストアンサー
    • Mac
  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず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]++; } }

  • オープンモードについて

    この下のソースを実行するとファイルの中身が「97へ」と出ます。 この「へ」とは何なのでしょうか?97にしたいのですが、どうすればよいのでしょうか?またなぜこのような結果になってしまったのでしょうか? int main(void) { FILE *fp; int d=97; fp=fopen("txt.txt","w+"); fprintf(fp,"%d",d); fscanf(fp,"%d",&d); printf("%d",d); fclose(fp); return 0; } 環境はVCC++2005です。

  • startコマンドについて

    2年前に納品されたシステムで、今年の8月中旬と下旬に2度電源が落ち(1度目は停電?、2度目は間違ってコンセントを抜いたらしい)、あるソフトが頻繁に参照/更新している作業ファイルの中身が消えてしまい、正常動作しなくなる事がありました。 本来なら、そのソフトが作業ファイルを頻繁に参照/更新する処理を改造すべきだと思うのですが、製作者が長期休暇(体調不良)に入っている為、最新のソースが手に入りません。 作業ファイルの中身があれば($$$=**等)正常に動作するので、元になる作業ファイルを準備しておき、そのファイルをコピー後、そのソフトが起動するバッチファイルを作成し、スタートアップでコールされるショートカットと入れ替えました。 バッチファイルでそのままソフトを実行すると、そのソフトが終了するまでDOS窓が開いたままとなるので、「startコマンド」を使用しました。 バッチファイルは、以下の通りです。 ECHO OFF copy ABC1_Base.dat ABC1.dat copy ABC2_Base.dat ABC2.dat copy ABC3_Base.dat ABC3.dat start ABC.exe EXIT この対応を9月16日に行ったのですが、それから2度、 Runtime Error! Program:C:\Program Files\~\XYZ.EXE abnormal program termination が発生しました。 ※「XYZ.EXE」は、「ABC.exe」が起動し、「XYZ.EXE」が起動していなければ Shell関数で起動させるソフトです。 ※ABC.exe:VisualBasic6.0にて作成 ※XYZ.exe:VisualC++6.0にて作成 2年前に納品されてから、1度も「Runtime Error」は起きていない為、「startコマンド」が原因ではないかと上司から指摘されました。 「startコマンド」でぐぐって調べてみましたが、「Runtime Error」が起きたという報告は見付かりませんでした。 どなたか、「startコマンド」についての情報をお持ちの方はいらっしゃいませんか? 長文となってしまいましたが、よろしくお願いします。

専門家に質問してみよう