2

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

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

#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 中代码可以在没有任何更改的情况下编译。

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++ 应用程序中执行此操作。由于可执行文件的路径是在 main 方法的 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 库会有所帮助,尽管我没有使用它的经验(仅使用其他 boost 库 - 那些效果很好)

于 2009-06-08T11:13:59.653 回答
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 执行二进制文件 in..而不是 in data/。如果您运行 MSVC,则可以确定。

因此,将代码更改为

#包括
使用命名空间标准;
int main() {
  ifstream in("file.t");
  诠释n;
  在>>n;
}

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

于 2009-06-08T11:19:42.183 回答
0

这意味着当你运行程序时你的当前目录没有设置到它应该在的位置(它可能在你的主目录中)。尝试像这样运行程序:

cd whatever_dir_is_above_data
./my_prog

编辑:糟糕,您可能还需要./在程序之前,因为.可能不在您的路径中(我忘了它,因为我总是将它设置在我的路径中,所以我不必输入它)。

于 2009-06-08T11:20:55.270 回答
0

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

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

只需检查大小写,即所有 linux 路径都是区分大小写的。当我们从 Windows 迁移到 Linux 时,我们错过了它

于 2009-06-08T11:38:52.770 回答
0

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

在代码块中,您可以输入工作目录(它将启动程序),我不小心放了一个 . 在那里。

于 2009-06-23T11:44:37.267 回答