Система сохранения не открывает файлы fstream?

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

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main ( int argc, char* argv[])
{
   struct charFile
   {
      int chapterNum;
      int savePoint;
      string firstName;
      char gender, hairColor, hairType, hairLength, eyeColor, profession, magic, martialSkills;
      bool hasPet;
   } character;

   fstream save;

   char saveFileChoice;
   string saveFile;

   cout << "Select a File (1, 2, 3, 4, 5, or 6): ";
   cin >> saveFileChoice;


   saveFile = saveFileChoice + ".charsav";

   save.open(saveFile.c_str());
   if (!save.good())
   {
      cout << "Save file cannot be opened.\n";
   }

   char tempStr[12];
   save.getline (tempStr, 256);
   if ( tempStr == "EMPTY" )
   {
      cout << "There is no save data in the file.  Starting a new game...\n\n";
      cout << "What is your character's name? ";
      cin >> character.firstName;
      save << character.firstName;

   }

return 0;
}

Мне было интересно, почему файл никогда не попадал в оператор if, даже если он был пуст, а затем, даже когда я добавил в файл ПУСТЫЕ символы ascii и изменил условие. Затем я вставил:

if (!save.good())
       {
          cout << "Save file cannot be opened.\n";
       }

и при запуске постоянно выдает сообщение, что файл почему-то не открывается. =/ Я не могу понять, почему.

Я проверил файлы, и они не отформатированы как .charsav.txt или что-то в этом роде, они все еще просто 1.charsav, 2.charsav и т. д. Я чувствую, что мне не хватает чего-то простого и очевидного. Может ли кто-нибудь указать это для меня?


person Forynia    schedule 04.08.2012    source источник
comment
Обработка строк должна быть: std::string tempStr; std::getline(save, tempStr);. Но вы все еще забываете массу ошибок, проверяя слева, справа и по центру.   -  person Kerrek SB    schedule 05.08.2012
comment
У вас есть права на запись в рабочий каталог?   -  person Kerrek SB    schedule 05.08.2012
comment
@KerrekSB Да, есть много ошибок, которые я в конечном итоге проверю, чтобы убедиться, что пользователь вводит правильный тип символа, а не значение, отличное от 1-6 и т. д. и т. д. На данный момент, когда я знал, какой ввод должен быть, я Я оставил такие вещи выключенными. Я попробую эти операции std::string, но я не уверен, насколько они будут эффективны, если fstream выйдет из строя, если он откажется открывать файл, который я мог бы получить от него, пока коровы не вернутся домой, так сказать, и... правильно ли я написал getline или нет, он все равно будет выпадать из оператора if, поскольку он не будет работать, пока fstream находится в состоянии сбоя.   -  person Forynia    schedule 05.08.2012


Ответы (1)


if (!strcmp(tempStr, "EMPTY" )) как вы сравниваете строки

person Anders Lindén    schedule 04.08.2012
comment
Эм... хорошо, спасибо, я воспользуюсь этим. Хотя другой временно работает для моих целей, как это было с файлом madlib, который мы делали в классе. Тем не менее, у меня все еще не открывается fstream, поэтому в tempStr даже не с чем сравнивать, потому что fstream не открыт? - person Forynia; 05.08.2012
comment
Есть и другие методы fstream, с которыми вы можете поэкспериментировать: .eof() и .is_open(). - person Anders Lindén; 05.08.2012
comment
добавление следующих тестов: 'save.open(saveFile.c_str()); if (!save.good()) { cout ‹‹ Невозможно открыть файл сохранения.\n; } if (save.fail()) cout ‹‹ Сохранить файл не удалось. ‹‹ эндл; if (save.bad()) cout ‹‹ Неверный файл сохранения. ‹‹ эндл; if (save.is_open())', и он отображает сообщение об ошибке с ошибкой, поэтому fstream не работает. По крайней мере, это не .bad()! ха-ха! Хотя все равно интересно почему. Интересно, как я могу объединить имя файла из выбора пользователя? знак равно - person Forynia; 05.08.2012
comment
Я бы использовал saveFile = saveFileChoice; файл сохранения += .charsav; - person Anders Lindén; 05.08.2012
comment
Еще одна вещь, которую стоит отметить, когда вам не удается открыть файл, вы печатаете сообщение, но после этого у вас действительно должно быть еще, чтобы код, обрабатывающий открытый файл, не запускался в случае сбоя. - person Anders Lindén; 05.08.2012
comment
ХА! Вот и все. =P Мне нужно выяснить, почему эта конкретная конкатенация искажает значение saveFile, но теперь она открывает поток и соответствующим образом сравнивает содержимое, разделяя два утверждения, как вы предложили. Странно, но сейчас работает. Благодарю вас! - person Forynia; 05.08.2012