1

特定のフォルダにあるデータを含むファイルを読み取りたいプロジェクトがあります。プログラムを実行するためのスクリプトファイルがあり、このスクリプトファイルはコンピューターのどこにでも置くことができるため、プログラムで関数getcwdを使用してデータファイルのパスを取得することはできません。私の質問は、Cで目的のファイルが配置されている場所からパスを取得する可能性があるかどうかです。つまり、スクリプトが実行される場所ではありませんか?

例:開始スクリプトのディレクトリ:/home/user/my_files/scripts/start_script.shメインルーチンのディレクトリ:/ home / user / project /

4

3 に答える 3

1

cd <specific dir>スクリプトでは、絶対パスを使用してバイナリを開始できます。

cd <specific dir>
/home/user/project/main

その後、mainあなたの中で非常にうまくやって、getcwd()<specific dir>戻された可能性がありますmain


そして、いいえ、mainからに位置するパスを取得するためのポータブルな方法はありませんmain

于 2013-02-25T15:52:47.317 に答える
1

@Matthiasは質問へのリンクを提供しており、実行可能ファイルの場所を見つけるためのさまざまな方法が十分に説明されています。

もう1つ追加できます。

プログラムをインストールするときに、実行可能ファイルにパスを直接埋め込むことができます。

たとえば、プログラムでは、次のような配列を定義できます。

char ExecutablePath[16 + 1024] = "&Unique#!%Stuff~";

ここで、最初の16文字は、プログラム内の他の場所では発生しない一意のシーケンスを形成し、最後の1024文字には、最初は不明なパスが含まれます。

インストール中に、実行可能ファイルでこの一意の文字のシーケンスを検索し、見つかったら、その直後のファイルにパスを書き込みます。

OSがチェックサムを検証する場合は、ファイルのチェックサムを調整する必要がある場合があります(Windowsは気にしないようです)。

于 2013-02-25T19:21:10.757 に答える
0

私が間違っている場合は訂正してください。bytはを使用して逃げることができるようですargv[0]

int main(int argc, char** argv)
{
     printf("Name of executable: %s\n", argv[0]);

     /* extract everything before first '/' from argv[0] */
     char buffer[SomeLargeNumber];

     char* ptr = argv[0] + strlen(argv[0]) - 1;

     while(*ptr != '/' && ptr != argv[0]) { ptr--; }

     int len = ptr - argv[0];

     memcpy(buffer, argv[0], len);
     buffer[len] = '/';
     buffer[len + 1] = 0;

     return printf("Directory: %s\n", buffer);
}
于 2013-02-25T11:20:49.143 に答える