所以在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中代码可以编译而无需任何更改。
答案 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)
使用绝对路径后,我发现了错误。
在代码块中,你可以进入工作目录(它会启动程序),我不小心把它放了。在那里。