绝对路径......困惑(ubuntu)

时间:2009-06-08 11:10:09

标签: c++ linux ubuntu path codeblocks

所以在Ubuntu的Code :: Blocks中(最新)。

我有一个项目,我在其中加载文件并从中读取数字。

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

现在使用cout<<n它会显示-1203926(和其他随机数字),但文件中的数字为0

data是二进制文件的位置(我的意思是数据和二进制文件在同一个文件夹(Program)中)我希望这条路径在Windows中是相对的......但是只有我把它放满了路径/home/csiz/Desktop/C++/ep0/Program/data/file.t它会给我一个0

你能告诉我如何使它成为相对路径吗?我更喜欢这样的东西,以便在Windows中代码可以编译而无需任何更改。

8 个答案:

答案 0 :(得分: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上重新分发你的应用程序时,数据文件通常放在与你的可执行文件不同的目录(通常是/ var / lib)中(通常是/usr/bin).

所以它是初始化脚本,或者在环境变量中传递数据目录的路径,执行它就像这样......

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

答案 1 :(得分:1)

我认为Boost Filesystem library会有所帮助,虽然我对它没有任何经验(只有其他的推文库 - 那些效果很好)

答案 2 :(得分:0)

如果二进制文件位于data目录中,请使用file.t而不是data/file.t

答案 3 :(得分:0)

要获得Windows和Linux的可移植路径,您需要编写自己的方法来调整文件路径,或者最好使用像boost::filesystem这样的库。

我在我的项目中使用了boost :: filesystem,我推荐它。创建路径很容易,检查文件是否存在,创建目录等等。对于初学者c ++程序员而言,可能是陡峭的学习曲线,但创建文件路径等基本内容应该很容易。

答案 4 :(得分:0)

此相对路径在“Windows”中的唯一原因是您的IDE在..而不是data/中执行二进制文件。如果您运行MSVC,您可以确定它。

所以,将代码更改为

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

然后将IDE当前目录更改为data/ - &gt;端口完成! :)

答案 5 :(得分:0)

这意味着运行程序时当前目录未设置到应该的位置(可能位于主目录中)。尝试运行这样的程序:

cd whatever_dir_is_above_data
./my_prog

编辑:哎呀,在程序开始之前你可能还需要./,因为.可能不在你的路径中(我忘记了因为我总是在我的路径中设置它)路径,所以我不必输入它。)

答案 6 :(得分:0)

将/ data目录复制到项目的bin目录或编译二进制文件的位置。

对于linux和windows,相对路径是相同的(是完全相同的用法,我在我的跨平台应用程序编码中每天使用它们)。

只检查CASE,即所有linux路径都是CASE-SENSITIVE。我们从Windows迁移到Linux时会错过的东西

答案 7 :(得分:0)

使用绝对路径后,我发现了错误。

在代码块中,你可以进入工作目录(它会启动程序),我不小心把它放了。在那里。