2009-06-08 43 views
2

所以在Ubuntu中的Code :: Blocks(最新)。絕對路徑...困惑(Ubuntu的)

我有一個項目,我加載一個文件並從中讀取一個數字。

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

現在有cout<<n它顯示-1203926(以及其他隨機數字),雖然在文件中的數字是0

data是其中的二進制是(我的意思是數據和二進制文件在同一個文件夾(程序)),我期待的路徑相對像在Windows中......但只有當我把完整路徑/home/csiz/Desktop/C++/ep0/Program/data/file.t它會給我一個0

你能告訴我如何使它成爲相對路徑嗎?我更喜歡一些東西,以便在Windows中代碼可以在沒有任何改變的情況下編譯。

+0

爲什麼downvote?這是一個有效的問題。 – Zifre 2009-06-08 11:24:06

+0

我希望你縮進你的真實代碼... – Zifre 2009-06-08 11:26:18

回答

0

使用絕對路徑後,我發現了錯誤。

在codeblocks中,你可以進入工作目錄(在那將啓動程序),我不小心把一個。在那裏。

0

如果二進制文件在data目錄中,則使用file.t而不是data/file.t

+4

更不用說,路徑是相對於你運行的二進制文件,而不是它所在的位置...... – workmad3 2009-06-08 11:17:04

+0

數據和二進制文件位於同一文件夾中,代碼塊運行EXE文件夾(我也嘗試從終端運行...) – csiz 2009-06-08 11:29:16

0

要獲得便攜式路徑,您要麼需要編寫自己的方法,Windows和Linux調整文件路徑或最好使用庫如boost::filesystem

我在我的項目中使用了boost :: filesystem,我推薦它。很容易創建路徑,檢查文件是否存在,創建目錄等。也許對於初學者的C++程序員來說學習曲線陡峭,但是像創建文件路徑這樣的基本東西應該很容易。

+0

所以另一個downvoter走過去downvoting的樂趣(?)...因爲沒有評論他在我的跨平臺的建議中發現什麼問題圖書館訪問路徑沒有代碼在Ubuntu和Windows更改......據我所知,提升是好的那種想法... – stefanB 2009-06-09 03:29:24

0

此相對路徑在「Windows」中的唯一原因是您的IDE在..而不是data/中執行二進制文件。如果你運行MSVC,你可以確定它。

因此,改變代碼

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

然後更改IDE當前目錄data/ - >端口完成! :)

0

這意味着當您運行該程序時,您的當前目錄未設置爲應該在的位置(可能位於您的主目錄中)。試運行的程序是這樣的:

cd whatever_dir_is_above_data 
./my_prog 

編輯:哎呀,你可能還需要./程序之前,因爲.可能不是您的路徑(我忘了,因爲我一直把它在我的路徑,我不必輸入它)。

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++應用程序中執行此操作。由於可執行文件的路徑在main方法的argv [0]中傳遞,所以可以這樣做。因爲當你在Linux上重新分配你的應用程序時,數據文件通常放在與你的可執行文件(通常是/ usr/bin)不同的目錄下(通常是/ var/lib)。

所以它要麼初始化腳本,或者通過你的數據目錄的路徑中的環境變量,像這樣執行它...

MY_APP_DATA_PATH=/var/lib/my-app /path/to/executable 
0

複製/ data目錄到項目的bin目錄或編譯二進制文件的位置。

相對路徑是相同的Linux和Windows(是完全相同的用法,我每天在我的跨平臺應用程序編碼中使用它們)。

只檢查CASE,即所有的linux路徑都是CASE-SENSITIVE。它是當我們從Windows遷移到Linux時錯過的東西