【问题标题】:std::ifstream::open() not workingstd::ifstream::open() 不工作
【发布时间】:2010-09-26 08:33:39
【问题描述】:

我正在开发一个游戏的原型,并且某些游戏规则将在 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 文件位于同一目录中。

【问题讨论】:

  • 文件名是Rules.ini还是rules.ini?

标签: c++ stl iostream


【解决方案1】:

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

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

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

您可以通过检查传递给main()argv[0] 参数来获取可执行文件的名称。或者,如果您使用的是 Windows,则可以通过将 NULL 作为第一个参数传递给 GetModuleFileName() 来获取它。

【讨论】:

    【解决方案2】:

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

    "rules.ini" 不是完整路径,所以它必须是相对的,所以它是相对的。或者你需要在那里使用完整路径。

    【讨论】:

    • 对不起,忘了说,这个文件和我的 .exe 文件在同一个目录下。我认为这应该适用于默认设置?
    • 艾斯蒂娜,没有。它取决于当前的工作目录。例如,如果您的应用是使用 ../a.out 执行的,它将失败
    【解决方案3】:

    (这里是疯狂的假设)您正在使用 Visual Studio。在调试期间,您的程序将在项目目录中搜索“rules.ini”

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2014-09-29
      • 2013-05-09
      • 1970-01-01
      • 2016-03-01
      相关资源
      最近更新 更多