c++ - 为结构读取 C++ 中的二进制文件的运行时错误

标签 c++ struct save runtime-error

我一直在尝试从 C++ 中的二进制文件中读取数据,但出现运行时错误,程序已停止工作!

我以前用过类似的代码,它仍然有效。我在执行 SettingsClass 类的构造函数时出错 [可能是因为读取函数,因为在删除它之后,一切都运行良好。]

struct Setting{
    int SettingID;
    int SettingINTValue;
    double SettingDOUBLEValue;
    char SettingCHARValue;
    string SettingSTRINGValue;
    string SettingName;
};

class SettingsClass {
  public:
    void ResetSettings() {
       fstream SettingFile;                                  
       Setting defaultsetting[NoOfSettings];

       for(int i=1;i<=NoOfSettings;i++) {
         defaultsetting[i-1].SettingID = i;
         defaultsetting[i-1].SettingINTValue = 0;
         defaultsetting[i-1].SettingDOUBLEValue = 0.0;
         defaultsetting[i-1].SettingCHARValue = '#';
         defaultsetting[i-1].SettingSTRINGValue = "null";
         switch(i) {
           default:
             defaultsetting[i-1].SettingName = "Compression Levels";
             defaultsetting[i-1].SettingSTRINGValue = "Normal";
             defaultsetting[i-1].SettingINTValue = 1;
             break;
         }
         cout<<i<<". "<<defaultsetting[i-1].SettingName<<"\n\t "<<defaultsetting[i-1].SettingINTValue<<"\n\t "<<defaultsetting[i-1].SettingDOUBLEValue<<"\n\t "<<defaultsetting[i-1].SettingCHARValue<<"\n\t "<<defaultsetting[i-1].SettingSTRINGValue<<"\n\t ";
         cout<<"\n";
       }

       SettingFile.open(SettingsFilePath,ios::binary|ios::out);
       if(SettingFile.is_open()){
         SettingFile.write(reinterpret_cast<char const *>(&defaultsetting),sizeof(defaultsetting));
       } else {
         cout<<"Error!";
       }
       SettingFile.close();                                   
    }

    SettingsClass() {
        fstream SettingFile;
        SettingFile.open(SettingsFilePath,ios::binary|ios::in);
        if(SettingFile.is_open()) {
          Setting TempSettings[NoOfSettings]; 
          SettingFile.read((char*)&TempSettings,sizeof(TempSettings)); 
        } else {
          cout<<"Error...";
        }
        SettingFile.close();
    }
} Settings;

最佳答案

您应该阅读并了解有关文件流和相关输入和输出运算符的更多信息 <<>> .您不能像这行代码那样简单地将字符输入到数组中:

SettingFile.read((char*)&TempSettings,sizeof(TempSettings)); 

数组不是char然而你却这样投下了它。相反,您应该遍历可用的输入并填充数组,例如:

for(size_t i = 0; i<NoSetting; ++i) {
  SettingFile >> TempSettings[i];
}

当然你应该重载适当的输入运算符:

istream& operator>>(istream& _is, Setting& _s) {
  //read all variables of setting, i.e.:
  //_is >> _s.var1;
  //_is >> _s.var2;
  //etc.
}

您的输出可能有相同的错误。你应该重载:

ostream& operator<<(ostream& _os, const Setting& _s) {
  //output all variables of Setting, e.g.:
  //_os << _s.var1;
}

做这样的事情而不是文件流 write :

for(size_t i = 0; i<NoSetting; ++i) {
  SettingsFile << defaultSetting[i];
}

关于c++ - 为结构读取 C++ 中的二进制文件的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19501297/

相关文章:

c++ - GCC 4.7 编译的库是否与 GCC 4.6.3 程序兼容?

c++ - 邻接链表C++展示

c++ - 使用 CFileDialog 打开文件失败时如何捕获异常

C++ 类成员函数到 C 结构函数指针

c - 删除列表中的最后一个元素

Java - 记住/保存输入字段的程序

C++ microshell,输入命令并使用 fork()、dup()、pipe() 将其通过管道传输到进程。只是我没有得到我想要的结果

c++ - 如何在 C++ 中访问结构内部的结构?

java - 在 Java 程序中保存和加载自定义对象

swift - 如何保存标签内容