std :: ifstream :: open()不起作用

时间:2008-12-10 23:15:36

标签: c++ stl iostream

我正在为游戏开发原型,并且某些游戏规则将在ini文件中定义,以便游戏设计师可以调整游戏参数,除了重新编译之外,无需我的帮助。这就是我目前正在做的事情:

std::ifstream stream;
stream.open("rules.ini");

if (!stream.is_open())
{
    throw new std::exception("Rule file could not be opened");
}

// read file contents here

stream.close();

但是,我的流不会成功打开。在调试期间深入到STL源中深入了解_getstream()(在stream.c中定义)继续返回NULL,但我无法弄清楚为什么会这样。帮忙,有人吗?

编辑:Rules.ini与.exe文件位于同一目录中。

3 个答案:

答案 0 :(得分:7)

您假设工作目录是您的可执行文件所在的目录。这是一个不好的假设。

您的可执行文件可以从任何工作目录运行,因此在软件中对相对路径进行硬编码通常是一个坏主意。

如果您希望能够访问相对于可执行文件位置的文件,则应首先确定可执行文件的路径并从中创建完全限定的路径。

您可以通过检查传递给argv[0]的{​​{1}}参数来获取可执行文件的名称。或者,如果你在Windows上,你可以通过传递NULL作为第一个参数来获得GetModuleFileName()

答案 1 :(得分:2)

您的开放流的范围是否正确。

“rules.ini”不是一个完整的路径所以它必须是相对的,所以它相对于什么。或者你需要在那里使用完整路径。

答案 2 :(得分:0)

(狂野的假设)你正在使用visual studio。在调试期间,您的程序将在项目目录中搜索“rules.ini”

但是,如果您尝试从“myproject / debug / myexe.exe”执行程序,它应该运行正常,因为它将搜索“/ debug”rules.ini

就像它提到的那样,你应该指定完整路径,因为相对路径往往会导致错误