std :: ifstream :: open () не работает - PullRequest
1 голос
/ 11 декабря 2008

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

7 голосов
/ 11 декабря 2008

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

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

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

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

2 голосов
/ 11 декабря 2008

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

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

0 голосов
/ 11 декабря 2008

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

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

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

...