2014-09-12 1 views
1

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

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.

ответ

2

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

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

Смежные вопросы