2

UbuntuのCode::Blocks(最新)でそうです。

ファイルをロードしてそこから数値を読み取るプロジェクトがあります。

#include <fstream>
using namespace std;
int main(){
    ifstream in("data/file.t");
    int n;in>>n;
}

ファイル内の番号cout<<n-12039260

dataはバイナリの場所です(データとバイナリが同じフォルダー(プログラム)にあることを意味します)。パスはWindowsのように相対パスであると予想していました...しかし、フルパスを入力した場合に/home/csiz/Desktop/C++/ep0/Program/data/file.tのみ0.

相対パスにする方法を教えてください。Windowsでコードを変更せずにコンパイルできるようにすることをお勧めします。

4

8 に答える 8

2

パスは、アプリケーションが存在するディレクトリではなく、現在の作業ディレクトリに対する相対パスです。

簡単な解決策は、次のように、作業ディレクトリをアプリケーションのディレクトリに変更してアプリを実行する SH スクリプトを用意することです。

$!/bin/sh

cd `dirname $0` # changes the working dir to the script's dir

./application-name # executes your application

# no need changing back to your previous working directory
# the chdir persists only until the end of the script

アプリケーションに初期化スクリプトがあることは珍しくありません。

メインの C/C++ アプリケーション内でこれを行うこともできます。実行可能ファイルのパスはメイン メソッドの argv[0] で渡されるため、同じことができます。

ただし、Linux でアプリケーションを再配布する場合、データ ファイルは通常、実行可能ファイル (通常は /usr/bin) とは別のディレクトリ (通常は /var/lib) に配置されるため、お勧めしません。

したがって、それは初期化スクリプトであるか、データディレクトリのパスを環境変数に渡し、次のように実行します...

MY_APP_DATA_PATH=/var/lib/my-app /path/to/executable
于 2009-06-08T11:31:29.930 に答える
1

私は経験がありませんが、Boost Filesystemライブラリが役立つと思います(他のブーストライブラリだけで-それらはうまく機能しました)

于 2009-06-08T11:13:59.653 に答える
0

絶対パスを使用した後、間違いを見つけました。

コードブロックでは、作業ディレクトリ (プログラムを起動するディレクトリ) を入力できますが、誤って . そこで。

于 2009-06-23T11:44:37.267 に答える
0

バイナリがdataディレクトリにある場合は、file.t代わりにdata/file.t.

于 2009-06-08T11:13:04.443 に答える
0

Windows と Linux のポータブル パスを取得するには、独自のメソッドを記述してファイル パスを調整するか、できればboost::filesystemなどのライブラリを使用する必要があります。

私は自分のプロジェクトで boost::filesystem を使用しましたが、それをお勧めします。パスの作成、ファイルの存在確認、ディレクトリの作成などを簡単に行うことができます。初心者の C++ プログラマーにとって学習曲線は急かもしれませんが、ファイル パスの作成などの基本的なことは簡単なはずです。

于 2009-06-08T11:15:52.097 に答える
0

この相対パスが "Windows" で機能する唯一の理由は、IDE が..ではなく でバイナリを実行するためdata/です。MSVC を実行している場合は、それを確認できます。

したがって、コードを次のように変更します

#含む
名前空間 std を使用します。
int main() {
  ifstream in("file.t");
  int n;
  で>>n;
}

次に、IDE の現在のディレクトリをdata/-> port complete!に変更します。:)

于 2009-06-08T11:19:42.183 に答える
0

これは、プログラムを実行したときの現在のディレクトリが、あるべき場所に設定されていないことを意味します (おそらくホーム ディレクトリにあります)。次のようにプログラムを実行してみてください。

cd whatever_dir_is_above_data
./my_prog

EDIT:おっと、おそらくあなたのパスにない./ので、おそらくプログラムの前にも必要です.(私はいつも自分のパスに設定しているので、入力する必要はありません)。

于 2009-06-08T11:20:55.270 に答える
0

/data ディレクトリを、プロジェクトの bin ディレクトリまたはバイナリがコンパイルされる場所にコピーします。

相対パスは、Linux と Windows で同じです (はい、まったく同じ使用法です。クロスプラットフォーム アプリケーションのコーディングで毎日使用しています)。

CASE をチェックするだけです。つまり、すべての Linux パスは CASE-SENSITIVE です。Windows から Linux に移行するときに見逃してしまうもの

于 2009-06-08T11:38:52.770 に答える