在for循环中使用if语句时ifstream的奇怪行为

时间:2014-12-06 20:01:17

标签: c++ input iostream ifstream file-handling

我正在开发游戏并建立持久对象我正在为每个对象调用一个函数,该函数将当前状态输出到一个文件,以便在调用新游戏实例后读回。

这是保存文件保存以供参考:

  

”   Ť   1   10   五   1   五   1   0   0   0   1   15   H   ñ   0   〜   小号   2   10   6   2   6   2   0   0   0   2   15   H   ñ   0   〜   “

这些空格实际上是'\ n'字符,但为了便于阅读,我将其浓缩了

现在这只是用其先前的数据重新创建类“T”的实例所需的信息。这是我的恢复代码

for (int i = 0; i < previousActiveCount; i++) {

            file >> typeToRestore;
            if (typeToRestore == 'T') {
                  T* to_restore = new T();
                  T->restore(file, this);
               //calls the restore function for the object of type T which has takes file by reference and then takes input from there
              } else if (typeToRestore == 'S'){
                 S* to_restore = new S();
                 S->restore(file, this); 
                }
}

现在出现的问题是,当在对象内部调用恢复时(文件通过引用传递),文件未被正确读取。它没有在文件中前进。 if子句完成后,如果我执行文件&gt;&gt;,文件永远不会从'T 1 ...〜'字符变为'S 2 ...〜' VAR;对于if语句中的T的所有参数,它们都是从文件中获取的。如果我从恢复功能(继承自相同的基类)开始,则不会从文件中设置变量。

这是一个示例恢复功能'S :: restore(file&amp;);

if (file.is_open()) {
    int fileID;
    double fileSize;
    double destination_x;
    double destination_y;
    double location_x;
    double location_y;
    double delta_x;
    double delta_y;
    int fileReefID;
    int fileHomeId;
    double fileEnergy;
    double fileState;
    int targetID;
    double fileRange;
    int fileAttack_strength;
    char endFlag;
    file >> fileID;
    file >> fileSize;
    file >> destination_x;
    file >> destination_y;
    file >> location_x;
    file >> location_y;
    file >> delta_x;
    file >> delta_y;
    file >> fileReefID;
    file >> fileHomeId;
    file >> fileEnergy;
    file >> fileState;
    file >> targetID;
    file >> fileRange;
    file >> fileAttack_strength;
    file >> endFlag;
    //do restore procedures
   }

此函数中未设置任何变量。可能是因为我传递的ifstream实例太多了吗?

层次结构是

- 的功能1

  • 创建一个Ifstream对象
  • 在类(Model)中调用恢复游戏函数,并通过引用传递此文件
  • 关闭ifstream文件。
  • 模型的恢复功能
  • 从函数1中获取文件的输入。
  • 创建第一个char标识的任何类的默认实例
  • 调用默认类'restore function。
  • 默认课程恢复功能
  • 按顺序输入已保存的内容。
  • 相应地设置数据字段
  • 如果值无效,则抛出异常。

此实例给我的所有行为都非常令人费解,我确信我只是在退出上述函数链后才关闭该文件。在输入之前我也在检查它是否打开。如果我不进入第三个函数它是好的并且所有输入都有效但是只要我执行if语句并将文件输入发送到默认的类恢复函数,输入就不是它应该来自的文件。

0 个答案:

没有答案