2009-06-08 15 views
2

だから、Code :: Blocks in Ubuntu(最新)。絶対パス...混乱している(ubuntu)

私はファイルを読み込んでそこから数値を読み込むプロジェクトを持っています。 cout<<nと今

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

ファイル内の番号は0ですが、それは(と他の乱数)-1203926を示しています。

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

これを相対パスにする方法を教えてもらえますか? Windowsでは、コードを変更せずにコンパイルできます。

+0

なぜdownvoteですか?これは有効な質問です。 – Zifre

+0

あなたの実際のコードをインデントすることを願っています... – Zifre

答えて

0

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

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

0

バイナリがdataディレクトリにある場合は、data/file.tの代わりにfile.tを使用します。

+4

このパスは、バイナリをどこから実行したのかとは関係ありません。 – workmad3

+0

データとバイナリは同じフォルダにあり、codeblocksはそのフォルダから実行されているようなexe(私も端末から実行しようとしました...) – csiz

1

私はそれとまったく経験持っていないaltough Boost Filesystem libraryは、役立つだろうと思います(ただ、他のブーストライブラリとを - それらはとてもうまくいった)

0

は、あなたがあなた自身のメソッドを書くことのいずれかが必要になりますWindowsおよびLinux用のポータブルパスを取得するにはファイルパスを調整するか、好ましくはboost::filesystemのようなライブラリを使用します。

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

+0

別のdownvoterはfun(?)のためにdownvotingを歩いていたので...彼はクロスプラットフォームの私の提案ライブラリは、ubuntuとwindows上でコードを変更することなくパスにアクセスする...私が知っている限り、ブーストはそのような考えのために良いです... – stefanB

+0

同じ - しかし、私はもののようなものについて考えを停止しました.. – bernhardrusch

0

"Windows"でこの相対パスが動作する唯一の理由は、IDEがdata/の代わりに..のバイナリを実行することです。 MSVCを実行する場合は、それを確認することができます。 >ポートの完全な -

ので、変更コードは

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

は、data/にIDEカレントディレクトリを変更します! :)

0

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

cd whatever_dir_is_above_data 
./my_prog 

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

+0

私はドン ' 〜/ desktop/C++/ep0/Program $ ep0 bash:ep0:コマンドが見つかりません ep0はプログラムディレクトリにあります – csiz

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 
+0

'basename'ではなく' dirname'を意味すると思います – KayEss

+0

ええ、ごめんなさい。修正しました。 –

0

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

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

CASEを確認するだけです。つまり、すべてのLinuxパスがCASE-SENSITIVEです。私たちがWindowsからLinuxに移行するときに見逃すもの

関連する問題