保存系统不打开 fstream 文件?

Posted

技术标签:

【中文标题】保存系统不打开 fstream 文件?【英文标题】:Save system not opening fstream files? 【发布时间】:2012-08-04 21:49:35 【问题描述】:

我正在开发一个游戏的保存文件系统,并试图确保我可以在一个小测试程序中打开文件,确定它是否为空,如果为空提示用户创建角色,如果它不为空,则将角色的信息加载到用于游戏的变量中。到目前为止,在我的测试中,我已经在记事本中创建了文件(将它们留空),使用适当的扩展名保存它们,并尝试打开文件并测试它们是否为空。

#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 语句中,然后即使我在文件中添加了 EMPTY ascii 字符并更改了条件。然后我输入:

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

并在运行时不断显示消息,因此由于某种原因文件未打开。 =/我不知道为什么。

我检查了这些文件,它们没有被格式化为 .charsav.txt 或任何东西,它们仍然只是 1.charsav、2.charsav 等。我觉得我错过了一些简单而明显的东西。谁能帮我指出来?

【问题讨论】:

字符串处理应该是:std::string tempStr; std::getline(save, tempStr);。但是您仍然忘记了左右和中心的大量错误检查。 你有写入工作目录的权限吗? @KerrekSB 是的,我最终会检查很多错误,确保用户输入的字符类型正确,而不是 1-6 以外的值等等。现在当我知道输入必须是什么我已经离开了那种事情。我会尝试那些 std::string 操作,但我不确定如果 fstream 失败,如果它拒绝打开文件,我可以从它那里得到线,直到奶牛回家,我不确定它们会有多有效,并且...无论我是否正确编写了 getline,它仍然会从 if 语句中消失,因为它在 fstream 处于失败状态时不起作用。 【参考方案1】:

if (!strcmp(tempStr, "EMPTY" )) 是您比较字符串的方式

【讨论】:

嗯...谢谢你,我会用它。虽然其他的暂时适用于我的目的,就像我们在课堂上做的 madlib 文件一样。不过,我仍然无法打开 fstream,所以它甚至没有在 tempStr 中得到任何可以比较的东西,因为 fstream 没有打开? 您可以尝试其他一些 fstream 方法,.eof() 和 .is_open() 添加以下测试:'save.open(saveFile.c_str()); if (!save.good()) cout 我会使用 saveFile = saveFileChoice;保存文件 += ".charsav"; 还有一点值得注意,当你打开文件失败时,你会打印一条消息,但你真的应该有一个 else 之后,这样处理打开文件的代码就不会在失败的情况下运行

以上是关于保存系统不打开 fstream 文件?的主要内容,如果未能解决你的问题,请参考以下文章

C++文件流的C++ 中 *fstream 操作

C++ 我用的fstream打开,结果读完后却写不进去了,无法输入新的成绩

C++的fstream如何检查一个文件是不是成功打开?

fstream 中判断是否成功打开文件

c++文件流fstream中的函数

cpp程序使用fstream进行多文件输入