#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が
できたということです。

私としては同じディレクトリ内に作成してくれなくては
都合が悪いのです。この現象が起きる理由あるいは
解決法をご存知の方がいらっしゃいましたらどうかよろしく
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (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 の存在する位置のフルパスを取得できますから、それを使ってやればいいです。詳細はマニュアルを調べてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/03 23:30

設定の変更が必要です


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

この回答への補足

たいへんありがとうございます!!
どうかもう一声お願いします。
xyz.exeを
エル・エス・アイ ジャパン(株)の 「LSI C-86 Ver 3.3 試食版」
で作成したのならあなた様のおっしゃるとおりに解決できました。

ですがVCで作成した実行ファイルでは(私の環境では)
右クリック→プロパティ→・・・全般
のタブしかでてきません。
LSIで作成したものでは
全般、プログラム、フォント、メモリ、画面、その他
のタブが出てくるのですが・・・

VCでこれらの項目を出現させるにはどうしたらよいのでしょうか?

補足日時:2001/05/03 23:27
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/05/03 23:45

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

このQ&Aと関連する良く見られている質問

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Qfor文を別のint内で定義し、初めのint文内で呼び出す??? 何という名のプログラム名?ですか???

毎度毎度忙しい中失礼します。現在<私のプログラム>を基に<参照プログラム>のようにプログラムを作り変えようとしていますが、正直お手上げ状態です。

どうしても<参照プログラム>に基づいてプログラムを組まなければならないのです。

どこがお手上げ状態かといえば、<参照プログラム>を参考にすると、int multInts(int x, int y)内の条件の組み方が<私のプログラム>内でどのようにして組めばいいのかが全くもって分かりません。かなり考えても分からないレベルです・・・私にとっては。
int multInts(int x, int y)の定義の仕方を真似て<私のプログラム>でも真似てみるのですが・・・出来ないのです。何をどう直せば良いのでしょうか???初期化でtra=0;とすると、表示は"0"になったりするし・・・。簡単かと思われるかもしれませんが・・・私にとってはかなり難しいのです。
”丸投げ”みたいな感じで恥ずかしいのですが、どうかアドバイスだけでも下さい。お願いします。

出力結果
1.5桁数字入力:"12345"と入力 (これは出来ます)
2.偶数桁のみ抽出して2倍にする→"14385" (最不明部: <参照プログラム>内のmultInts内の条件を<私のプログラム>内でどのようにして組むのかが分かりません)
3.各桁の数値を足し合わせる→1+4+3+8+5=21(不明部: 2.が出来ないので出来ません)
4.その数値が”妥当”か”不当”かをDOS?画面に表示(不明部:2.と3.が出来ないので出来ません)

<私のプログラム>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int num,tra;
int inpt=5;
int inptnum;
int sum=0;
//#define 0

printf("5桁入力; ");
scanf("%d", &num);

if (num==0){
printf("その値は0です。 \n");
}

else{

for(inpt ; inpt >=1 ; inpt--)

{
if(inpt%2 == 0) {
inptnum = pow(10,inpt-1);
tra = (num/inptnum)%10;
//printf("%d",tra*2);
tra=(tra*2)/10+(tra*2)%10;
printf("%d",tra);
}

else{
inptnum = pow(10,inpt-1);
tra = (num/inptnum)%10;
printf("%d",tra);
}

sum += tra;

}
printf("\n %d\n",sum);

sum= sum%10;
if(sum==0)
{
printf("妥当な数値です。\n");
}
else
{
printf("不当な数値です。\n");
}
}
system("pause");

return 0;
}

<参照プログラム>
#include <stdio.h>
#include <stdlib.h>

int main(){
int multInts(int x, int y);
int num1,num2,answer;
printf("間にスペース設けて2つの値入力: ");
scanf("%d%d", &num1, &num2);

answer = multInts( num1, num2);
printf("%d * %d=%d\n", num1, num2, answer);
system("pause");
return 0;
}
int multInts(int x, int y)
{
int result = 0;
int i;
for (i=1 ;i<=y ;i++)
{
result=result + x;
}
return result;
}

毎度毎度忙しい中失礼します。現在<私のプログラム>を基に<参照プログラム>のようにプログラムを作り変えようとしていますが、正直お手上げ状態です。

どうしても<参照プログラム>に基づいてプログラムを組まなければならないのです。

どこがお手上げ状態かといえば、<参照プログラム>を参考にすると、int multInts(int x, int y)内の条件の組み方が<私のプログラム>内でどのようにして組めばいいのかが全くもって分かりません。かなり考えても分からないレベルです・・・私にとっては。
int mul...続きを読む

Aベストアンサー

理屈だけ書いておくね

○入力された物は「数値」
○これを「桁毎にバラす」という方法が必要
 ◆演算によって1桁ずつ取り出す
 ◆そもそも入力を文字列にしてしまって後で数値に戻す
 のどちらかの方法が考えられる

いずれにしても「配列」という概念が必要になるかもしれないね

Qsystem関数でexeファイルを読み込みexeファイルからtxtアウトしたい

system関数を使ってaaa.exeを読み込み、そのaaa.exeの中でbbb.txtに数値を書き込みたいのですが、正しく書き込めず
0.611745
0.200018
0.611745
0.200018
0.611745
0.200018
と常に一定の値しか返しません。これは何故なのでしょうか?教えていただけませんか。よろしくお願いします。

Aベストアンサー

aaa.exeが一定の値しか返さないようにできているからです。
hm...
大方、乱数の種をきちんと設定していないんでしょう。

Qint rev_int(int num)文  関数の入門

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転した値を返す*/

intrev_int(int num)
{


inttmp = 0;

if(num> 0){
do{
tmp = tmp * 10 + num % 10;
num /= 10;
}while (num > 0);

}

return (tmp);

}

int main(void)
{

int nx = scan_uint();

printf("反転した値は%dです。\n", rev_int(nx));

return 0;

}

教えてください!参考書に書いてあることをまとめて
プログラムを読んでるのですが、わからない部分があります。
(1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは
読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。

(2)int scan_uint(void)の文は理解できました。私なりに解釈したのは
ここでは正の数を入力しないと次に進まないことと
負の数を入力した場合、負の数を入力しないでくださいと注意がずっと
でるという文です。
質問ですが、このあとint rev_int(int num)文に移ると思うのですが
ここの int tmp = 0; これはこのint rev_int(int num)文のみの
tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で
出てきたtmpとは別個と解釈しました。

そうなると、int rev_int(int num)文を読んでみると

tmpの箱を作成。そこは0を代入。
if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??)

do文は
tmp = tmp*10 + num %10
num /=10
wile(num>0)

これを見る限り、numという箱が見えません。全体を見渡しても
どこかでnumに値が代入されたのち、このint rev_int(int num)
という文を読みこんでいき if num>0のときと宣言されていますが
もっと前の段階でnumの値が入力されていない限り
このif文は適用されないと思ったのですが、プログラムは動いてます

三つ目の質問です
tmp = tmp *10 + num % 10
num /=10 の部分がわかりませんでした。
tmpはまず、int scan_uint(void)で作成したtmpと
int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが
正しいのであれば
tmpの値はここでは初のはずです。
一体いつ値を入力したのでしょうか?
もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが
どうしてtmpを10かけるのですか?123450になり、
そのあとnumの値が此処でもまだ不明なのですがnum/10したものと
足すみたいですが、わかりませんでした。。。

まとめると、tmp = tmp*10+num%10がわかりません。
また、numとは何かわかりません、値もどの値がどこで代入されていて
while(num>0)が引っかかるのか不明です。
tmpはint scan_uint文内で入力した値(scanfの部分で)
12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか?
参考書はなぜ別個と書いてるのかわかりません。

ごめんなさい>_< とても長くなりました。
どなたか解る方、教えてください、よろしくおねがいします。

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転...続きを読む

Aベストアンサー

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き始めます。

main関数で

int nx = scan_uint();
printf("反転した値は%dです。\n", rev_int(nx));

と、それぞれの関数を呼んでいるので、実際の動作を実行順に羅列すると
1.必ずmainの先頭からプログラム開始。
2.mainからscan_uintが呼ばれる。
3.呼ばれたscan_uintが処理を行う(内容は理解しているようなので省略)
4.scan_uintからmainに帰ってくる。その時の戻り値がnxに入る。
5.printfの引数にrev_int(nx)があるので、nxを引数にしてrev_intを呼ぶ。
6.呼ばれたrev_intは、nxの値をnumとして受け取る。
7.rev_intは受け取ったnum(mainのnxと同じ値)を元に処理を行う。
8.rev_intはtmpに作った値を戻り値として関数を終わる。
9.rev_intからmainに帰ってくる。その時の戻り値がprintfの引数になる。
10.mainからprintfが呼ばれる。
11.呼ばれたprintfは何かを画面に表示し、関数を終わる。
12.printfからmainに帰ってくる。printfの戻り値は受け取ってないので捨てられる。
13.mainがreturn 0;で関数を終わらせ、プログラムが終了する。
となります。

>これを見る限り、numという箱が見えません。全体を見渡しても
上記の6.で「引数の実体として、mainから渡してもらってる」でしょう?

それが判らなかったのは「プログラムはmainの先頭から実行する」と言うのを理解できていないからです。

(3)
>tmp = tmp *10 + num % 10
>num /=10 の部分がわかりませんでした。
>どうしてtmpを10かけるのですか?123450になり、
123450にはなりません。

rev_intに入ってきたら
int tmp = 0;
ってやってるので、tmpは「最初は0」です。別の場所(scan_uintなど)にあるtmpは「同姓同名の赤の他人」なので忘れましょう。

scan_uintで「12345」を入力すると、12345がmainのnxに返って来て(nxが12345になって)、そのnxの値である12345がrev_intに渡され、rev_intは12345をnumに受け取ります。

つまり「最初は、numは12345、tmpは0になっている」のです。

そして、numが0かどうか調べます。

numが0でない(12345になっている)ので、次に
tmp = tmp *10 + num % 10;
を実行します。

tmp(中身が0)を10倍した値と、numを10で割った余りを足し、tmpに戻しています。

つまり0を10倍した0に、12345を10で割った余り5を足し、足した結果5をtmpに戻します。なのでtmpは5になります。

次に
num /=10;
を実行します。

これは「numを10で割って、numに戻す」です。
num = num / 10;
と同じです。

numは12345なので、10で割った商1234がnumの新しい値になります。

なお、Cでは、整数の割り算の答えは「商」だけです。小数点以下はありません。例えば、1を10で割ると0になります。

次は、while文で「numが0より大きいなら繰り返し」です。

numが0より大きい(1234になっている)ので繰り返すことになり、また
tmp = tmp *10 + num % 10;
を実行します。

tmpは5になっているので10倍して50、それにnum(1234)を10で割った余り4を足し、足した54をtmpに戻します。

次に
num /=10;
を実行します。

numは1234なので、10で割った商123がnumの新しい値になります。

これを「numが0より大きい間、繰り返し」すると

tmp=0、num=12345

tmp=5、num=1234

tmp=54、num=123

tmp=543、num=12

tmp=5432、num=1

tmp=54321、num=0

となり、numが0になって繰り返すのをやめた時、tmpは54321になっています。

そして、最後に
return tmp;
として、54321をmainに返します。

mainに帰って来ると、前述の9.~11.の処理で
反転した値は54321です。
と表示されます。

>参考書はなぜ別個と書いてるのかわかりません。

「別の場所にある、同じ名前の変数は、同姓同名の赤の他人」なので「別個」です。

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き...続きを読む

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。


このカテゴリの人気Q&Aランキング

おすすめ情報