1

助けが必要な奇妙な問題があります。.txt ファイルからデータを取得し、別の .txt ファイルにデータを書き込む C++ プログラムを作成しました。Xcode でプログラムをコンパイルして実行すると、プログラム ファイルと同じディレクトリに出力ファイルが作成されます。これはまさに私が必要としているものです。しかし、Xcode を閉じてダブルクリックするだけでプログラムを実行すると、Users ディレクトリに出力ファイルが作成されます。これを修正する方法はありますか?

4

3 に答える 3

1

質問を完全に理解したかどうかはわかりませんが、出力ファイルに完全なファイル名 (パスを含む) を指定するだけでよいと思います。

于 2012-10-28T16:39:16.183 に答える
1

ファイル名に基づいて、または相対パスを使用してファイルを開くと、ファイルは現在の作業ディレクトリに対して相対的に開かれるか作成されます。XCode から実行すると、作業ディレクトリはバイナリが作成されたディレクトリに設定されるようですが、Finder は新しいプロセスを開始するときに現在の作業ディレクトリをホーム ディレクトリに設定します。

絶対パス (スラッシュで始まる) を指定するか、 の結果と でgetcwd()指定されたパスを組み合わせてバイナリの場所を計算することができますargv[0]argv[0]現在の作業ディレクトリに相対的なバイナリの場所が含まれているため、バイナリの場所を絶対パスとして計算するために使用できます。

于 2012-10-28T16:48:00.927 に答える
0

を使用argv[0]して、プログラムの完全なパスを取得できます。

次に、chdirそのパスに移動するか、最初のパスから作成されたフル パスを使用してターゲット ファイルを開きます。

例えば:

char path_buffer[512];

strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe

chdir(dirname(path_buffer));    // This is now /home/user/Desktop

fp = fopen("myfile.txt", "w");

"." が返されるため、返されるものは何でも「やみくもに」chdir入れても安全です。(現在のディレクトリ) エラーの場合。dirnamedirname

またはまた:

char path_buffer[512];
char new_buffer[512];

strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe

snprintf(new_buffer, 512, "%s/%s", dirname(path_buffer), "myfile.txt");
fp = fopen(new_buffer, "w");

上記は、実行可能ファイルの同じディレクトリでnew_buffer呼び出されるファイルの完全なパス名に設定されます。myfile.txt静的ストレージへのポインターを返す可能性があるため、2 つのバッファーが必要ですdirname。また、"myfile.txt" がpath_buffer.

path_bufferに頼らずに編集することは可能dirnameです。これにより、移植性の問題が発生します。ディレクトリ セパレータは必ずしも "/" ではないためです。「\」の場合もあります。

char path_buffer[512];
char *p, *q;
strncpy(path_buffer, argv[0], 512);
for (p = q = path_buffer; *p; p++)
    if (('/' == *p) || ('\\' == *p))
        q = p+1;
strncpy(q, "myfile.txt", 512 - (q - path_buffer));
// You may now use path_buffer as file name:
fp = fopen(path_buffer, "w");
于 2012-10-28T16:42:38.760 に答える