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

发布于 2024-07-23 05:32:08 字数 604 浏览 13 评论 0 原文

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

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

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

现在使用 cout< 它显示 -1203926 (和其他随机数),尽管文件中的数字是 0

data 是二进制文件所在的位置(我的意思是数据和二进制文件位于同一文件夹(程序)中),我期望路径是相对的,就像在 Windows 中一样......但前提是我输入完整的路径路径 /home/csiz/Desktop/C++/ep0/Program/data/file.t 它会给我一个 0

你能告诉我如何使其成为相对路径吗? 我更喜欢一些东西,以便在 Windows 中代码可以在不进行任何更改的情况下进行编译。

So in Code::Blocks in Ubuntu (latest).

I have a project in which I load a file and read a number from it.

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

now with a cout<<n it shows -1203926 (and other random numbers) though the number in the file is 0.

data is where the binary is(I mean data and binary are in the same folder(Program)) and I was expecting the path to be relative like in Windows... but only if I put the full path /home/csiz/Desktop/C++/ep0/Program/data/file.t it will get me a 0.

Can you tell me how to make it a relative path? I would prefer something so that in Windows the code can compile without any changes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

紫瑟鸿黎 2024-07-30 05:32:09

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

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

After using the absolute path I found the mistake.

In codeblocks you can enter the working directory (that in wich it will launch the program) and I accidentally put a . in there.

心碎无痕… 2024-07-30 05:32:08

该路径是相对于当前工作目录的,而不是相对于应用程序所在的目录。

一个简单的解决方案是使用 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

The path is relative to the current working directory, not to the directory your application is under.

A simple solution would be to have a SH script that changes the working directory to your application's directory, and then executes your app, like so:

$!/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

It's not uncommon for applications to have initialization scripts.

You could also do this inside your main C/C++ application. Since the path of the executable is passed in the main method's argv[0], you could do the same.

But I would advise against it, because when you're redistributing your application on Linux, data files are usually placed in a different directory (usually /var/lib) than your executables (usually /usr/bin).

So it's either an initialization script, or passing the path of your data directory in an environment variable, executing it like so ...

MY_APP_DATA_PATH=/var/lib/my-app /path/to/executable
心头的小情儿 2024-07-30 05:32:08

我认为 Boost 文件系统库 会有所帮助,尽管我没有任何经验(只是使用其他升压库 - 那些效果很好)

I think Boost Filesystem library would help, altough I have got no experience with it (just with other boost libraries - those worked great)

§普罗旺斯的薰衣草 2024-07-30 05:32:08

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

If the binary is in the data directory use file.t instead of data/file.t.

贪恋 2024-07-30 05:32:08

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

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

To get portable paths for windows and linux you will need to either write your own methods to adjust the file paths or preferably use library like boost::filesystem.

I've used boost::filesystem in my projects and I recommend it. It's easy to create path, check if file exists, create directories and so on. Maybe steep learning curve for beginner c++ programmer but the basic stuff like creating file path should be easy.

无悔心 2024-07-30 05:32:08

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

因此,更改代码,

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

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

The only reason this relative path works in "Windows" is that your IDE executes the binary in .. instead of in data/. If you run MSVC you can be sure of it.

So, change code to

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

then change IDE current directory to data/ -> port complete! :)

二智少女 2024-07-30 05:32:08

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

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

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

Copy the /data directory to the bin directory of the project or where the binary is compiled.

relative paths are the same for linux and windows(yes exactly same usage, i use them everyday in my cross-platform application coding).

just check for CASE, i.e all linux paths are CASE-SENSITIVE. its something we miss when we move from Windows to Linux

明媚如初 2024-07-30 05:32:08

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

cd whatever_dir_is_above_data
./my_prog

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

This means that your current directory when you run the program is not set to where it should be (it's probably at your home directory). Try running the program like this:

cd whatever_dir_is_above_data
./my_prog

EDIT: Oops, you probably also need ./ before the program, since . is probably not in your path (I forgot it because I always set it in my path so I don't have to type it).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文