0

NetBeansを使用してC++をプログラムします。実行可能ファイルの現在の絶対パスを取得したいのですが、

(~/NetBeansWorkSpace/project_1/dist/Debug/GNU-Linux-x86/executableFileName)

だから私は使用します

1、 system("pwd")

2、getcwd(buffer,bufferSize)

次に、実行ボタンをクリックしますが、すべて間違ったパスを取得します:〜/ NetBeansWorkSpace / project_1

これが驚きです、私はバッシュを実行します

cd ~/NetBeansWorkSpace/project_1/dist/Debug/GNU-Linux-x86/executableFileName

./executableFileName

私は正しい道をたどります。

それはなぜですか?

4

4 に答える 4

1

何も問題はありません-NetBeansは、現在の作業ディレクトリをプロジェクトディレクトリ(~/NetBeansWorkSpace/project_1)に設定してプログラムを実行しています。

プログラムは、現在のディレクトリがプログラムが存在するディレクトリと同じであることに依存してはなりません。プログラムの絶対パスを取得するためのいくつかの異なるメソッドを確認したい場合は、このスレッドを参照してください。

于 2012-10-29T16:13:26.467 に答える
1

他の誰もが述べているように、NetBeansはアプリケーションを実行する前に作業ディレクトリを設定しています。実行可能ファイルの作業ディレクトリを取得したい場合は、次のように機能すると思います。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const* *argv) {
    char *resolved = realpath(argv[0], NULL);
    if (resolved != NULL) {
        char *fname = strrchr(resolved, '/');
        if (fname != NULL) {
            fname[1] = '\0';
        }
        printf("absolute path of %s is %s\n", argv[0], resolved);
        free(resolved);
    } else {
        perror("realpath");
    }
    return EXIT_SUCCESS;
}
于 2012-10-29T16:34:18.630 に答える
0

NetBeansは、アプリケーション~/NetBeansWorkSpace/project_1/の先頭にパスを付けることにより、アプリケーションを開始しますdist/Debug/GNU-Linux-x86/

シェルを開き、CD~/NetBeansWorkSpace/project_1/を実行しdist/Debug/GNU-Linux-x86/executableFileNameてから実行すると、NetBeansからアプリを実行した場合と同じ結果が得られます。

于 2012-10-29T16:12:23.180 に答える
0

Linuxの場合:
システムコマンドを実行する機能

int syscommand(string aCommand, string & result) {
    FILE * f;
    if ( !(f = popen( aCommand.c_str(), "r" )) ) {
            cout << "Can not open file" << endl;
            return NEGATIVE_ANSWER;
        }
        const int BUFSIZE = 4096;
        char buf[ BUFSIZE ];
        if (fgets(buf,BUFSIZE,f)!=NULL) {
            result = buf;
        }
        pclose( f );
        return POSITIVE_ANSWER;
    }

次に、アプリ名を取得します

string getBundleName () {
    pid_t procpid = getpid();
    stringstream toCom;
    toCom << "cat /proc/" << procpid << "/comm";
    string fRes="";
    syscommand(toCom.str(),fRes);
    size_t last_pos = fRes.find_last_not_of(" \n\r\t") + 1;
    if (last_pos != string::npos) {
        fRes.erase(last_pos);
    }
    return fRes;
}

次に、アプリケーションパスを抽出します

    string getBundlePath () {
    pid_t procpid = getpid();
    string appName = getBundleName();
    stringstream command;
    command <<  "readlink /proc/" << procpid << "/exe | sed \"s/\\(\\/" << appName << "\\)$//\"";
    string fRes;
    syscommand(command.str(),fRes);
    return fRes;
    }

後にラインをトリミングすることを忘れないでください

于 2014-03-24T11:12:13.850 に答える