Не удается создать файл с помощью fstream в приложении Windows Store 8.1

Я использую Direct3D 11.1 для создания своей игры, я хочу сохранить последнюю запись игрока в файле, поэтому вот мой код: (он не работает в !File.good() )

fstream File("Score.txt");

            if (!File.good())
            {
                return;
            }
            if (!File.is_open())
            {
                return;
            }
            if (File.bad())
            {
                return;
            }
            Writer.Write("Easy", getString(Scene->Score), File);
            File.close();

и вот мой класс XMLWriter для записи в файл:

   class XmlWriter
{
public:
    void Write(string  const &replace, string const &replaceBy, fstream &file)
    {
        fstream tempFile;
        tempFile.open("ScoreT.xml", fstream::out | fstream::trunc | ios::app);
        if (!tempFile)
        {
            return;
        }
        string curLine = "";
        while (!file.eof())
        {
            getline(file, curLine);
            if (findWord(replace, curLine))
            {
                int j = 0;
                while (curLine[j] != replace[0])
                {
                    j++;
                }
                j += replace.size() + 1;
                for (int k = 0; k < replaceBy.size(); k++)
                {
                    curLine[j] = replaceBy[k];
                    j++;
                }
                if (curLine[j] != ',' && curLine[j] != '<')
                {
                    curLine[j] = ' ';
                }
                tempFile << curLine << "\n";
            }
            else
            {
                string temp = "";
                file << temp;
                tempFile << curLine << "\n";
            }
        }
        file.close();
        tempFile.close();
        if (remove("Setting.xml") != 0) perror("Error removing file!");
        rename("ScoreT.xml", "Score.xml");
    }
private:
    bool findWord(string search, string searchLine)
    {
        bool ret = false;
        for (int i = 0, j = 0; i < searchLine.size() && j<search.size(); i++)
        {
            if (search[j] == searchLine[i])
            {
                ret = true;
                j++;
                continue;
            }
            ret = false;
            j = 0;
        }
        return ret;
    }
};

но каждый раз, когда я запускаю его, он не может создать новый файл и выйти из строя! в чем проблема? Обратите внимание, что я делаю это в своем коде XAML.


person Peyman Tahghighi    schedule 12.09.2014    source источник


Ответы (1)


Приложениям магазина разрешен доступ на запись только к нескольким путям к файлам. При вызове fstream::open без полного пути API использует рабочий каталог, который в случае приложения магазина всегда является путем к пакету приложения (путь, к которому у приложения нет доступа для записи).

Решение состоит в том, чтобы использовать полный путь, к которому у приложения есть доступ для записи. Для сохранения данных игрока лучше всего использовать папку ApplicationData::Current->RoamingFolder, использовать свойство Path, чтобы получить полный путь, и добавить имя файла, которое вы хотите, к строке. Затем передайте полную строку пути к файлу в fstream::open, и все должно пройти успешно.

person MooseBoys    schedule 12.09.2014