助けが必要な奇妙な問題があります。.txt ファイルからデータを取得し、別の .txt ファイルにデータを書き込む C++ プログラムを作成しました。Xcode でプログラムをコンパイルして実行すると、プログラム ファイルと同じディレクトリに出力ファイルが作成されます。これはまさに私が必要としているものです。しかし、Xcode を閉じてダブルクリックするだけでプログラムを実行すると、Users ディレクトリに出力ファイルが作成されます。これを修正する方法はありますか?
3 に答える
質問を完全に理解したかどうかはわかりませんが、出力ファイルに完全なファイル名 (パスを含む) を指定するだけでよいと思います。
ファイル名に基づいて、または相対パスを使用してファイルを開くと、ファイルは現在の作業ディレクトリに対して相対的に開かれるか作成されます。XCode から実行すると、作業ディレクトリはバイナリが作成されたディレクトリに設定されるようですが、Finder は新しいプロセスを開始するときに現在の作業ディレクトリをホーム ディレクトリに設定します。
絶対パス (スラッシュで始まる) を指定するか、 の結果と でgetcwd()
指定されたパスを組み合わせてバイナリの場所を計算することができますargv[0]
。argv[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
入れても安全です。(現在のディレクトリ) エラーの場合。dirname
dirname
またはまた:
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");