绝对路径...困惑(ubuntu)
所以在 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 中代码可以在不进行任何更改的情况下进行编译。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
使用绝对路径后发现错误。
在代码块中,您可以输入工作目录(它将在其中启动程序),我不小心将 . 在那里。
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.
该路径是相对于当前工作目录的,而不是相对于应用程序所在的目录。
一个简单的解决方案是使用 SH 脚本将工作目录更改为应用程序的目录,然后执行应用程序,如下所示:
应用程序具有初始化脚本并不罕见。
您也可以在主 C/C++ 应用程序中执行此操作。 由于可执行文件的路径是在 main 方法的 argv[0] 中传递的,因此您可以执行相同的操作。
但我建议不要这样做,因为当您在 Linux 上重新分发应用程序时,数据文件通常放置在与可执行文件(通常为 /usr/bin)不同的目录(通常为 /var/lib)中。
所以它要么是一个初始化脚本,要么在环境变量中传递数据目录的路径,像这样执行它......
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:
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 ...
我认为 Boost 文件系统库 会有所帮助,尽管我没有任何经验(只是使用其他升压库 - 那些效果很好)
I think Boost Filesystem library would help, altough I have got no experience with it (just with other boost libraries - those worked great)
如果二进制文件位于
data
目录中,请使用file.t
而不是data/file.t
。If the binary is in the
data
directory usefile.t
instead ofdata/file.t
.要获得 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.
此相对路径在“Windows”中工作的唯一原因是您的 IDE 在
..
而不是data/
中执行二进制文件。 如果您运行 MSVC,您就可以确定这一点。因此,更改代码,
然后将 IDE 当前目录更改为
data/
-> 端口完成! :)The only reason this relative path works in "Windows" is that your IDE executes the binary in
..
instead of indata/
. If you run MSVC you can be sure of it.So, change code to
then change IDE current directory to
data/
-> port complete! :)将 /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
这意味着运行程序时您的当前目录未设置到应有的位置(它可能位于您的主目录)。 尝试像这样运行程序:
编辑:哎呀,您可能还需要在程序之前使用
./
,因为.
可能不在您的路径中(我忘记了,因为我总是将它设置在我的路径中,所以我不必输入它)。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:
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).