std :: ifstream :: open () не работает

Я разрабатываю прототип для игры, и определенные правила игры должны быть определены в 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.

10.12.2008 23:15:36
Это имя файла Rules.ini или rules.ini?
Whaledawg 10.12.2008 23:34:42
3 ОТВЕТА
РЕШЕНИЕ

Вы предполагаете, что рабочий каталог - это каталог, в котором находится ваш исполняемый файл. Это неверное предположение.

Ваш исполняемый файл может быть запущен из любого рабочего каталога, поэтому обычно плохая идея жестко кодировать относительные пути в вашем программном обеспечении.

Если вы хотите иметь доступ к файлам относительно местоположения вашего исполняемого файла, вы должны сначала определить путь к вашему исполняемому файлу и создать из него полный путь.

Вы можете получить имя вашего исполняемого файла, изучив argv[0]переданный параметр main(). Кроме того, если вы работаете в Windows, вы можете получить его GetModuleFileName(), передав NULL в качестве первого параметра.

7
11.12.2008 00:55:13

Является ли объем вашего открытого потока правильным.

"rules.ini" не полный путь, поэтому он должен быть относительным, так что он должен быть относительно. Или вам нужно использовать полный путь там.

2
10.12.2008 23:21:49
Извините, забыл упомянуть, файл находится в том же каталоге, что и мой файл .exe. Это должно работать с настройками по умолчанию, я думаю?
Aistina 10.12.2008 23:46:35
Айстина, нет. это зависит от текущего рабочего каталога. если ваше приложение было выполнено, например, с помощью ../a.out, оно потерпит неудачу
Johannes Schaub - litb 11.12.2008 00:41:31

(дикое предположение здесь) вы используете визуальную студию. Во время отладки ваша программа будет искать в каталоге проекта файл "rules.ini"

Однако, если вы попытаетесь выполнить вашу программу из «myproject / debug / myexe.exe», она должна работать нормально, потому что она будет искать «/ debug» для rules.ini

Как уже упоминалось, вы должны указать полный путь, потому что относительный путь может привести к ошибкам

0
11.12.2008 01:02:28