C++ Can';t在windows应用商店应用程序8.1中使用fstream创建文件

C++ Can';t在windows应用商店应用程序8.1中使用fstream创建文件,c++,windows-store-apps,direct3d11,C++,Windows Store Apps,Direct3d11,我正在使用direct3D 11.1创建我的游戏,我想将玩家的最后一条记录存储在一个文件中,下面是我的代码:(在!file.good()中失败) 下面是要写入文件的XMLWriter类: class XmlWriter { public: void Write(string const &replace, string const &replaceBy, fstream &file) { fstream tempFile;

我正在使用direct3D 11.1创建我的游戏,我想将玩家的最后一条记录存储在一个文件中,下面是我的代码:(在!file.good()中失败)

下面是要写入文件的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;
    }
};
classxmlwriter
{
公众:
无效写入(字符串常量和替换、字符串常量和替换、fstream和文件)
{
fstream临时文件;
open(“ScoreT.xml”,fstream::out | fstream::trunc | ios::app);
如果(!tempFile)
{
返回;
}
字符串卷曲=”;
而(!file.eof())
{
getline(文件、卷曲线);
if(findWord(替换,卷曲线))
{
int j=0;
while(curLine[j]!=替换[0])
{
j++;
}
j+=替换尺寸()+1;
对于(int k=0;k如果(curLine[j]!='、'&&curLine[j]!='商店应用程序只允许对少数文件路径进行写访问。通过调用
fstream::open
,而不使用完全限定路径,API将使用工作目录,在商店应用程序的情况下,工作目录始终是应用程序包路径(应用程序没有写访问权限的路径)

解决方案是使用应用程序具有写入权限的完全限定路径。要保存玩家数据,最好使用
ApplicationData::Current->RoamingFolder
文件夹,使用
path
属性获取完整路径,并将文件名附加到字符串中。然后传递完全限定的文件路径字符串到
fstream::open
,它应该会成功

   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;
    }
};